您现在的位置: 万盛学电脑网 >> 程序编程 >> 服务器教程 >> 正文

Linux下基于socket多线程并发通信的实现

作者:佚名    责任编辑:admin    更新时间:2022-06-22

 Linux下基于socket多线程并发通信的实现

分类: Linux2011-05-21 18:13 8455人阅读 评论(5) 收藏 举报socket多线程linuxserverstruct服务器[cpp] view plaincopy
  1. /*************************************************** 
  2. * 文件名:pthread_server.c 
  3. * 文件描述:创建子线程来接收客户端的数据 
  4. ***************************************************/  
  5. #include <sys/types.h>  
  6. #include <sys/socket.h>  
  7. #include <stdio.h>  
  8. #include <netinet/in.h>  
  9. #include <arpa/inet.h>  
  10. #include <unistd.h>  
  11. #include <stdlib.h>  
  12. #include <pthread.h>  
  13. void *rec_data(void *fd);  
  14. int main(int argc,char *argv[])  
  15. {  
  16.        int server_sockfd;  
  17.     int *client_sockfd;  
  18.        int server_len, client_len;  
  19.        struct sockaddr_in server_address;  
  20.        struct sockaddr_in client_address;  
  21.        struct sockaddr_in tempaddr;  
  22.        int i,byte;  
  23.        char char_recv,char_send;  
  24.        socklen_t templen;  
  25.        server_sockfd = socket(AF_INET, SOCK_STREAM, 0);//创建套接字  
  26.    
  27.        server_address.sin_family = AF_INET;  
  28.        server_address.sin_addr.s_addr =  htonl(INADDR_ANY);  
  29.        server_address.sin_port = htons(9734);  
  30.        server_len = sizeof(server_address);  
  31.         
  32.        bind(server_sockfd, (struct sockaddr *)&server_address, server_len);//绑定套接字  
  33.        templen = sizeof(struct sockaddr);  
  34.    
  35.        printf("server waiting for connect/n");  
  36.        while(1){  
  37.               pthread_t thread;//创建不同的子线程以区别不同的客户端  
  38.               client_sockfd = (int *)malloc(sizeof(int));  
  39.               client_len = sizeof(client_address);  
  40.               *client_sockfd = accept(server_sockfd,(struct sockaddr *)&client_address, (socklen_t *)&client_len);  
  41.               if(-1==*client_sockfd){  
  42.                      perror("accept");  
  43.                      continue;  
  44.               }  
  45.               if(pthread_create(&thread, NULL, rec_data, client_sockfd)!=0)//创建子线程  
  46.               {  
  47.                      perror("pthread_create");  
  48.                      break;  
  49.               }  
  50.        }  
  51.        shutdown(*client_sockfd,2);  
  52.        shutdown(server_sockfd,2);  
  53. }  
  54. /***************************************** 
  55. * 函数名称:rec_data 
  56. * 功能描述:接受客户端的数据 
  57. * 参数列表:fd——连接套接字 
  58. * 返回结果:void 
  59. *****************************************/  
  60. void *rec_data(void *fd)  
  61. {  
  62.        int client_sockfd;  
  63.        int i,byte;  
  64.        char char_recv[100];//存放数据  
  65.        client_sockfd=*((int*)fd);  
  66.        for(;;)  
  67.        {  
  68.               if((byte=recv(client_sockfd,char_recv,100,0))==-1)  
  69.               {  
  70.                      perror("recv");  
  71.                      exit(EXIT_FAILURE);   
  72.               }  
  73.               if(strcmp(char_recv, "exit")==0)//接受到exit时,跳出循环  
  74.                      break;  
  75.               printf("receive from client is %s/n",char_recv);//打印收到的数据  
  76.        }  
  77.      &