国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Linux > 正文

Linux下基于socket多線程并發(fā)通信的實(shí)現(xiàn)

2020-05-27 13:13:54
字體:
供稿:網(wǎng)友

 Linux下基于socket多線程并發(fā)通信的實(shí)現(xiàn)

分類: Linux2011-05-21 18:13 8455人閱讀 評(píng)論(5) 收藏 舉報(bào)socket多線程linuxserverstruct服務(wù)器[cpp] view plaincopy /***************************************************  * 文件名:pthread_server.c  * 文件描述:創(chuàng)建子線程來接收客戶端的數(shù)據(jù)  ***************************************************/   #include <sys/types.h>   #include <sys/socket.h>   #include <stdio.h>   #include <netinet/in.h>   #include <arpa/inet.h>   #include <unistd.h>   #include <stdlib.h>   #include <pthread.h>   void *rec_data(void *fd);   int main(int argc,char *argv[])   {          int server_sockfd;       int *client_sockfd;          int server_len, client_len;          struct sockaddr_in server_address;          struct sockaddr_in client_address;          struct sockaddr_in tempaddr;          int i,byte;          char char_recv,char_send;          socklen_t templen;          server_sockfd = socket(AF_INET, SOCK_STREAM, 0);//創(chuàng)建套接字              server_address.sin_family = AF_INET;          server_address.sin_addr.s_addr =  htonl(INADDR_ANY);          server_address.sin_port = htons(9734);          server_len = sizeof(server_address);                   bind(server_sockfd, (struct sockaddr *)&server_address, server_len);//綁定套接字          templen = sizeof(struct sockaddr);              printf("server waiting for connect/n");          while(1){                 pthread_t thread;//創(chuàng)建不同的子線程以區(qū)別不同的客戶端                 client_sockfd = (int *)malloc(sizeof(int));                 client_len = sizeof(client_address);                 *client_sockfd = accept(server_sockfd,(struct sockaddr *)&client_address, (socklen_t *)&client_len);                 if(-1==*client_sockfd){                        perror("accept");                        continue;                 }                 if(pthread_create(&thread, NULL, rec_data, client_sockfd)!=0)//創(chuàng)建子線程                 {                        perror("pthread_create");                        break;                 }          }          shutdown(*client_sockfd,2);          shutdown(server_sockfd,2);   }   /*****************************************  * 函數(shù)名稱:rec_data  * 功能描述:接受客戶端的數(shù)據(jù)  * 參數(shù)列表:fd——連接套接字  * 返回結(jié)果:void  *****************************************/   void *rec_data(void *fd)   {          int client_sockfd;          int i,byte;          char char_recv[100];//存放數(shù)據(jù)          client_sockfd=*((int*)fd);          for(;;)          {                 if((byte=recv(client_sockfd,char_recv,100,0))==-1)                 {                        perror("recv");                        exit(EXIT_FAILURE);                  }                 if(strcmp(char_recv, "exit")==0)//接受到exit時(shí),跳出循環(huán)                        break;                 printf("receive from client is %s/n",char_recv);//打印收到的數(shù)據(jù)          }          free(fd);          close(client_sockfd);          pthread_exit(NULL);   }           /***************************************************  * 文件名:pthread_client.c  * 文件描述:創(chuàng)建子線程來接收客戶端的數(shù)據(jù)  ***************************************************/   #include <sys/types.h>   #include <sys/socket.h>   #include <stdio.h>   #include <netinet/in.h>   #include <arpa/inet.h>   #include <unistd.h>   #include <stdlib.h>   int main(int argc,char *argv[])   {          int sockfd;          int len;          struct sockaddr_in address;             int result;          int i,byte;          char char_send[100] = { 0 };       if((sockfd = socket(AF_INET, SOCK_STREAM, 0))==-1)          {                 perror("socket");                 exit(EXIT_FAILURE);          }       if(argc != 3){         printf("Usage: fileclient <address> <port>/n");//用法:文件名 服務(wù)器IP地址 服務(wù)器端口地址         return 0;      }      if((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1){          perror("sock");          exit(1);      }      bzero(&address,sizeof(address));      address.sin_family = AF_INET;      address.sin_port = htons(atoi(argv[2]));      inet_pton(AF_INET,argv[1],&address.sin_addr);   len = sizeof(address);           if((result = connect(sockfd, (struct sockaddr *)&address, len))==-1)          {                 perror("connect");                 exit(EXIT_FAILURE);          }              for(;;)          {                scanf("%s", char_send);//輸入發(fā)送數(shù)據(jù)                 fflush(stdin);//清除輸入緩存                 if(strcmp(char_send, "exit")==0){//如果輸入exit,跳出循環(huán)                        if((byte=send(sockfd,char_send,100,0))==-1)                        {                               perror("send");                               exit(EXIT_FAILURE);                        }                                   break;                 }                                   if((byte=send(sockfd,char_send,100,0))==-1)                 {                        perror("send");                        exit(EXIT_FAILURE);                 }          }       close(sockfd);       exit(0);   }   

 

編譯服務(wù)器端程序 pthread_server.c :

$gcc pthread_server.c –o server –lpthread

編譯客戶端程序 pthread_client.c:

$gcc pthread_client.c –o client

編譯在開發(fā)板上跑的客戶端程序:

$arm-linux-gcc client.c –o arm_client

 

先啟動(dòng)服務(wù)器端的程序 server:

$./server

打開另一個(gè)終端,啟動(dòng)客戶端的程序 client:

$./client 127.0.0.1 9734

 

把 arm_client 放到開發(fā)板上,啟動(dòng) arm_client:

$./arm_client 219.222.170.9 9734

 

結(jié)果 :

服務(wù)器端:

tongs@tongs-desktop:~/c_c++_program/sock_inet_comm2$ ./server

server waiting for connect

receive from client is client

receive from client is client

receive from client is arm_client

receive from client is arm_client

客戶端:

tongs@tongs-desktop:~/c_c++_program/sock_inet_comm2$ ./client 127.0.0.1 9734

client

client

exit

 

開發(fā)板服務(wù)器端

[/mnt/yaffs/nfs_share/sock_tcp/thread_socket]./arm_client  219.222.170.9 9734

arm_client

arm_client

exit

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 五家渠市| 博白县| 胶南市| 长宁县| 嘉义市| 宁安市| 临沧市| 故城县| 绍兴县| 尤溪县| 莱州市| 于都县| 西安市| 双柏县| 蒲城县| 商丘市| 安国市| 浏阳市| 万全县| 大邑县| 繁昌县| 张家港市| 长治县| 醴陵市| 濮阳市| 类乌齐县| 盐源县| 通许县| 吴川市| 长汀县| 富川| 黄陵县| 巢湖市| 屯留县| 连江县| 曲麻莱县| 临漳县| 福安市| 满洲里市| 晋中市| 芒康县|