• 陕西守艺人丨被《舌尖上的中国》忽略的洛南空心挂面 2019-07-05
  • 湖州德清重点项目“磁吸”效应初显 2019-06-26
  • 《热血狂篮》邢菲接手涂冰成新领队 佟梦实“被贬”成普通朋友 2019-06-12
  • 海淀区西三旗地区2000余人共享首届冰雪欢乐节 2019-06-11
  • 央行:有效防控互联网金融领域风险 2019-06-09
  • 【读史忆人·典故】邓小平为周谷城题写校名 2019-06-08
  • 李军的专栏作者中国国家地理网 2019-06-08
  • 保护英烈权益要用好公益诉讼 2019-06-07
  • 比利时并不轻松地击败巴拿马 2019-06-07
  • 【学习时刻】北大马院副院长宇文利:大学生要在思想政治教育课中努力形成正确认识 2019-06-06
  • 真的很美!越冬候鸟迎来迁徙高峰 2019-06-05
  • 这些咖啡馆里,能喝到好奇心和想象力 2019-06-04
  • 博通裁员1100人以削减成本 涉及公司所有业务部门 2019-06-03
  • 唱作人丁于发新歌《派爱》 打造新春求爱完美情歌丁于《派爱》 2019-06-02
  • 从海员到工人运动的杰出领袖——苏兆征 2019-06-02
  • 大红鹰水心高手坛一尾中特: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-07-05
  • 湖州德清重点项目“磁吸”效应初显 2019-06-26
  • 《热血狂篮》邢菲接手涂冰成新领队 佟梦实“被贬”成普通朋友 2019-06-12
  • 海淀区西三旗地区2000余人共享首届冰雪欢乐节 2019-06-11
  • 央行:有效防控互联网金融领域风险 2019-06-09
  • 【读史忆人·典故】邓小平为周谷城题写校名 2019-06-08
  • 李军的专栏作者中国国家地理网 2019-06-08
  • 保护英烈权益要用好公益诉讼 2019-06-07
  • 比利时并不轻松地击败巴拿马 2019-06-07
  • 【学习时刻】北大马院副院长宇文利:大学生要在思想政治教育课中努力形成正确认识 2019-06-06
  • 真的很美!越冬候鸟迎来迁徙高峰 2019-06-05
  • 这些咖啡馆里,能喝到好奇心和想象力 2019-06-04
  • 博通裁员1100人以削减成本 涉及公司所有业务部门 2019-06-03
  • 唱作人丁于发新歌《派爱》 打造新春求爱完美情歌丁于《派爱》 2019-06-02
  • 从海员到工人运动的杰出领袖——苏兆征 2019-06-02
  • 0809国王杯马德里竞技比赛直播 江西快三开奖结果走势图 北京单场开奖sp计算 乐游棋牌app旧版本下载 下载北京麻将 波斯波利斯复原图 巴拉多利德西甲最新排名 哈德斯菲尔德大学学费 追寻太阳注册 今日陕西十一选五推荐号码