萬盛學電腦網

 萬盛學電腦網 >> 服務器教程 >> Linux下基於socket多線程並發通信的實現

Linux下基於socket多線程並發通信的實現

 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.      &
copyright © 萬盛學電腦網 all rights reserved