Linux下socket双向通信

时间:2016-07-26 09:32来源:未知 作者:Linux先生 举报 点击:
linux下的socket与windows下的类似,就是少一个初始化的过程。 服务端 客户端 1 创建socket 1 创建socket 2 绑定 2 连接 3 监听 4 接受 发送与接受消息,客户端

  linux下的socket与windows下的类似,就是少一个初始化的过程。

  服务端                      客户端

  1 创建socket          1 创建socket

  2 绑定                      2 连接

  3 监听

  4 接受

  发送与接受消息,客户端与服务端都是用的recv与send,在使用完成后记得close,以释放端口资源。

  下面是服务端

[cpp] view plain copy

  1. #include <stdio.h>  

  2. #include <stdlib.h>  

  3. #include <string.h>  

  4. #include <sys/types.h>  

  5. #include <sys/socket.h>  

  6. #include <netinet/in.h>  

  7. #include <arpa/inet.h>  

  8. #include <unistd.h>  

  9. #include <iostream>  

  10. using namespace std;  

  11. #include <pthread.h>  

  12.   

  13. void* receiveMsg(void *sock)  

  14. {  

  15.     char buffer[4096];  

  16.     int* socket = (int*)sock;  

  17.     while (1) {  

  18.         memset(buffer,0,sizeof(buffer));  

  19.         ssize_t byteCount = recv(*socket, buffer, 4096, 0);  

  20.     if(byteCount <= 0)  

  21.         {  

  22.             continue;  

  23.         }  

  24.         cout << "recv:" <<buffer << endl;  

  25.     }  

  26. }  

  27.   

  28. void* sendMsg(void* sock)  

  29. {  

  30.     while (1) {  

  31.         usleep(500);  

  32.         char buffer[4096];  

  33.         memset(buffer, 0, sizeof(buffer));  

  34.         cin >> buffer;  

  35.         if(strlen(buffer) < 0)  

  36.         {  

  37.             continue;  

  38.         }  

  39.         ssize_t byteCount = send(*(int*)sock, buffer, 4096, 0);  

  40.         if(byteCount < 0)  

  41.         {  

  42.             cout << "send failed" << endl;  

  43.         }  

  44.     }  

  45. }  

  46.   

  47. int main()  

  48. {  

  49.     pthread_t sendPthread;  

  50.     pthread_t recvPthread;  

  51.   

  52.     in_port_t servPort = 7777;  

  53.     int servSock;  

  54.     if ((servSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)//创建socket  

  55.     {  

  56.         cout << "socket error" << endl;  

  57.     }  

  58.   

  59.     struct sockaddr_in servAddr;  

  60.     memset(&servAddr, '\0'sizeof(struct sockaddr_in));  

  61.     servAddr.sin_family = AF_INET;  

  62.     servAddr.sin_addr.s_addr = htonl(INADDR_ANY);//让系统自动填充地址,不用自己去查明本机的地址是多少  

  63.     servAddr.sin_port = htons(servPort);  

  64.   

  65.     if(bind(servSock, (struct sockaddr*)&servAddr, sizeof(servAddr)) < 0) //把套接字绑定到指定的地址与端口  

  66.     {  

  67.         cout << "bind error" << endl;  

  68.     }  

  69.   

  70.     if(listen(servSock, 5)< 0)//开始监听,等待客户端的连接,listen调用之前,客户端无法连接到服务端,第二个参数为最大连接数  

  71.     {  

  72.         cout << "listen filed" << endl;  

  73.     }  

  74.   

  75.     struct sockaddr_in clntAddr;  

  76.     socklen_t clntAddrLen = sizeof(clntAddr);  

  77.     int clntSock = accept(servSock, (struct sockaddr*)&clntAddr, &clntAddrLen);  

  78.   

  79.     if (clntSock < 0)  

  80.     {  

  81.         cout << "accept error" << endl;  

  82.     }  

  83.   

  84.     char clntName[1024];  

  85.     if (inet_ntop(AF_INET, &clntAddr.sin_addr.s_addr, clntName, sizeof(clntName)) != NULL) {  

  86.         cout << "Handling client: " << clntName << " port: " << ntohs(clntAddr.sin_port) << endl;;  

  87.     } else {  

  88.         cout << "client address get failed " << endl;  

  89.     }  

  90.   

  91.     pthread_create(&sendPthread, NULL, sendMsg, &clntSock);  

  92.     pthread_create(&recvPthread, NULL, receiveMsg, &clntSock);  

  93.     pthread_join(sendPthread, 0);  

  94.     pthread_join(recvPthread, 0);  

  95. }  


下面是客户端

 

 

[cpp] view plain copy

  1. #include <stdio.h>  

  2. #include <stdlib.h>  

  3. #include <string.h>  

  4. #include <sys/types.h>  

  5. #include <sys/socket.h>  

  6. #include <netinet/in.h>  

  7. #include <arpa/inet.h>  

  8. #include <unistd.h>  

  9. #include <iostream>  

  10. using namespace std;  

  11.   

  12. void* sendMsg(void * socket)  

  13. {  

  14.     int sock = *((int*)socket);  

  15.     while (1) {  

  16.         char msg[4096];  

  17.         memset(msg, 0, sizeof(msg));  

  18.         cin >> msg;  

  19.         size_t outputlength = strlen(msg);  

  20.         if (0 == outputlength)  

  21.         {  

  22.             continue;  

  23.         }  

  24.   

  25.         ssize_t bytecount = send(sock, msg, outputlength, 0);//发送消息  

  26.         if (bytecount < 0) {  

  27.             cout << "send failed" << endl;  

  28.         }  

  29.     }  

  30. }  

  31.   

  32. void* recvMsg(void * socket)  

  33. {  

  34.     int sock = *((int*)socket);  

  35.     while (1) {  

  36.         char msg[4096];  

  37.         memset(msg, 0, sizeof(msg));  

  38.   

  39.         ssize_t bytecount = recv(sock, msg, sizeof(msg), 0); //接收消息  

  40.         if (bytecount <= 0) {  

  41.             continue;  

  42.         } else {  

  43.             cout << "recv:" << msg << endl;  

  44.         }  

  45.   

  46.     }  

  47. }  

  48.   

  49. int main()  

  50. {  

  51.     pthread_t recv;  

  52.     pthread_t send;  

  53.     char ipaddr[14] = "127.0.0.1";  

  54.     int port = 7777;  

  55.     int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//AF_INET指明使用ipv4,sock_stream指定使用流套接字,ipproto_tcp指定使用tcp协议  

  56.   

  57.     if (sock < 0) {  

  58.         cout << "socket() failed" << endl;  

  59.     }  

  60.   

  61.     struct sockaddr_in servAddr;//结构体用于存放地址  

  62.     memset(&servAddr, '\0'sizeof(struct sockaddr_in));  

  63.     servAddr.sin_family = AF_INET;  

  64.   

  65.     int rtn = inet_pton(AF_INET, ipaddr, &servAddr.sin_addr.s_addr);//转换ip地址格式,从本机字节序转换成为网络字节序  

  66.     if (rtn == 0) {  

  67.         cout << "address wrong ,inet_pton() failed" << endl;  

  68.     } else if (rtn < 0) {  

  69.         cout << "inet_pton() failed" << endl;  

  70.     }  

  71.   

  72.     servAddr.sin_port = htons(port);  

  73.   

  74.     if(connect(sock, (struct sockaddr*)&servAddr, sizeof(servAddr)) < 0)//连接到服务器  

  75.     {  

  76.         cout << "connect failed" << endl;  

  77.     }  

  78.   

  79.     pthread_create(&recv, NULL, recvMsg, &sock);  

  80.     pthread_create(&send, NULL, sendMsg, &sock);  

  81.     pthread_join(recv, 0);  

  82.     pthread_join(recv, 0);  

  83.   

  84.     close(sock);  

  85. }  

  注意:网络接收到的数据可能是不安全的,在使用printf等函数时要注意安全。

------分隔线----------------------------
发布者资料
Linux炫酷 查看详细资料 发送留言 加为好友 用户等级:高级会员 注册时间:1970-01-01 08:01 最后登录:2016-12-09 14:12
推荐内容