• 你不看文章的内容吗? 2019-09-14
  • 回复@“老笑头”,你的这种逻辑是你当年生sj病住院时向你同室的“病友”学来的吧!哈哈哈哈! 2019-09-05
  • 江西吉安永丰县:芒种农忙(图) 2019-09-01
  • 2018 E3:女主持人展位探访 被吓的花容失色 2019-08-27
  • 习近平为诊治“长江病”把脉开方 2019-08-27
  • 公共图书馆如何更有效地服务读者 2019-08-26
  • 让全民“动”起来 网友:健身配套设施不能少 2019-08-11
  • 海峡两岸青年交流:一灯引千灯 灯灯相辉映 2019-08-09
  • 陕西守艺人丨被《舌尖上的中国》忽略的洛南空心挂面 2019-07-05
  • 湖州德清重点项目“磁吸”效应初显 2019-06-26
  • 《热血狂篮》邢菲接手涂冰成新领队 佟梦实“被贬”成普通朋友 2019-06-12
  • 海淀区西三旗地区2000余人共享首届冰雪欢乐节 2019-06-11
  • 央行:有效防控互联网金融领域风险 2019-06-09
  • 【读史忆人·典故】邓小平为周谷城题写校名 2019-06-08
  • 李军的专栏作者中国国家地理网 2019-06-08
  • 一尾中特在哪个网站:Linux下socket双向通信

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

    免费一尾中特 www.nifws.tw   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
    推荐内容
  • 免费一尾中特
  • 你不看文章的内容吗? 2019-09-14
  • 回复@“老笑头”,你的这种逻辑是你当年生sj病住院时向你同室的“病友”学来的吧!哈哈哈哈! 2019-09-05
  • 江西吉安永丰县:芒种农忙(图) 2019-09-01
  • 2018 E3:女主持人展位探访 被吓的花容失色 2019-08-27
  • 习近平为诊治“长江病”把脉开方 2019-08-27
  • 公共图书馆如何更有效地服务读者 2019-08-26
  • 让全民“动”起来 网友:健身配套设施不能少 2019-08-11
  • 海峡两岸青年交流:一灯引千灯 灯灯相辉映 2019-08-09
  • 陕西守艺人丨被《舌尖上的中国》忽略的洛南空心挂面 2019-07-05
  • 湖州德清重点项目“磁吸”效应初显 2019-06-26
  • 《热血狂篮》邢菲接手涂冰成新领队 佟梦实“被贬”成普通朋友 2019-06-12
  • 海淀区西三旗地区2000余人共享首届冰雪欢乐节 2019-06-11
  • 央行:有效防控互联网金融领域风险 2019-06-09
  • 【读史忆人·典故】邓小平为周谷城题写校名 2019-06-08
  • 李军的专栏作者中国国家地理网 2019-06-08
  • 福彩刮刮乐在线刮 幸运飞艇正规嘛 福建时时奖金规则 比特币分分彩是假的 在线棋牌下载 北京快车pk10手机开奖直播 重庆时时宝宝计划 无忧花app 老时时彩360开奖结果 香港马会内部公开最准