UNIX网络编程练习-传递结构体做为参数
2015-11-30 21:41
519 查看
// my_sum.h namespace unix_sum { struct in_data { int a1; int a2; }; struct result { int sum; }; typedef in_data iv; typedef result rs; } // 定义数据结构
// 客户端程序 // DATE: 2015.11.30 // AUTH: robertkun #include <netinet/in.h> #include <sys/socket.h> #include <arpa/inet.h> #include <stdlib.h> #include <stdio.h> #include <iostream> #include <string.h> #include <unistd.h> #include "my_sum.h" using namespace std; typedef sockaddr SA; int main(int argc, char* argv[]) { if(argc != 2) { cerr<<"ip not define!"<<endl; return 0; } // 创建套接字 int sockfd = socket(AF_INET, SOCK_STREAM, 0); if(sockfd < 0) cerr<<"socket init error!"<<endl; // 初始化地址 struct sockaddr_in addr; bzero(&addr, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(6543); // 装字符串转换成网络地址 if(inet_pton(AF_INET, argv[1], &addr.sin_addr) <= 0) { cerr<<"addr error!"<<endl; return 0; } // 连接服务器 if(connect(sockfd, (SA *)&addr, sizeof(addr)) < 0) { cerr<<"connect error!"<<endl; return 0; } unix_sum::iv _data; _data.a1 = 1; _data.a2 = 2; int nw = write(sockfd, &_data, sizeof(_data)); // 读取数据 int n = 0; char buff[256] = {0}; while((n = read(sockfd, buff, 256)) > 0) { buff = 0; cout<<buff<<endl; } if(n < 0) { cerr<<"read error!"<<endl; return 0; } return 1; }
// 服务端程序 // DATE: 2015.11.30 // AUTH: robertkun #include <netinet/in.h> #include <sys/socket.h> #include <sys/types.h> #include <arpa/inet.h> #include <stdlib.h> #include <stdio.h> #include <iostream> #include <string.h> #include <unistd.h> #include <errno.h> #include "my_sum.h" using namespace std; typedef struct sockaddr SA; int get_sock_addr(int _sockfd) { struct sockaddr_storage ss; socklen_t len = sizeof(ss); if(getsockname(_sockfd, (SA *)&ss, &len) < 0) return -1; return ss.ss_family; } int main() { char buff[256] = {0}; // 创建TCP套接字 int _fd = socket(AF_INET, SOCK_STREAM, 0); // 绑定端口到套接字 struct sockaddr_in addr; bzero(&addr, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl(INADDR_ANY); addr.sin_port = htons(6543); if(bind(_fd, (SA *)&addr, sizeof(addr)) != 0) { cerr<<"bind error!"<<errno<<endl; return -1; } // 打开监听 if(listen(_fd, 256) != 0) { cerr<<"listen error!"<<endl; return -1; } // 等待连接 while(1) { struct sockaddr_in c_addr; socklen_t c_len = sizeof(c_addr); // 这里必须初始化,才可以使用 int _connfd = accept(_fd, (SA *)&c_addr, &c_len); if(_connfd) { cout<<"accept ok! "<<"client = "<<inet_ntoa(c_addr.sin_addr) <<":"<<ntohs(c_addr.sin_port)<<endl; } unix_sum::iv _data; int nr = read(_connfd, &_data, sizeof(_data)); if(nr <= 0) cerr<<"read error!"<<endl; cout<<"_data.a1 = "<<_data.a1<<" _data.a2 = "<<_data.a2<<endl; snprintf(buff, sizeof(buff), "sum = %d \r\n", _data.a1+_data.a2); write(_connfd, buff, strlen(buff)); // 终止连接 close(_connfd); } return 0; }
运行结果:
服务端:
客户端:
相关文章推荐
- TCP/IP (四) TCP连接的关闭
- App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure.
- 神经网络学习 之 BP神经网络
- java网络编程
- IP数据报、TCP报文、UDP报文格式
- A 类,B 类 ,C类网络地址的最大网络数,以及网段内最大主机数
- A 类,B 类 ,C类网络地址的最大网络数,以及网段内最大主机数
- http://stackexchange.com/
- ElasticSearch2.0 index中文乱码及解决问题
- UDP、TCP、RTP三种协议的总结
- 神经网络(8)---如何求神经网络的参数:cost function的表达
- Android——子线程中访问网络数据问题
- 基于AFNetworking封装的网络请求工具类【转载】
- RTP-RTCP协议分析
- 基于AFNetworking的网络判断【转载】
- 安卓网络通信框架Volley学习(二)基于Volley高效加载网络图片
- https 双向认证开发实践
- TCP三次握手四次挥手
- iOS开发网络—数据安全
- Android: 网络请求Error,socket error可能原因之-1