现在的位置: 首页 > 综合 > 正文

使用C语言进行socket 多线程编程

2018年06月10日 ⁄ 综合 ⁄ 共 2325字 ⁄ 字号 评论关闭
  1. #include <string.h>   
  2. #include <sys/types.h>   
  3. #include <sys/socket.h>   
  4. #include <NETINET/in.h>   
  5. #include <ERRNO.H>   
  6. #include <PTHREAD.H>   
  7.   
  8. #define MYPORT          8080   
  9. #define STRLEN          1024   
  10.   
  11.   
  12. void *Recv(void * arg1)  
  13. {  
  14.     int i,ret;  
  15.     int outp=0;  
  16.     int outfd=*(int *)arg1;  
  17.     char buf[STRLEN];  
  18.     while(1)  
  19.     {  
  20.         memset(buf,0,STRLEN);  
  21.         ret=recv(outfd,buf,STRLEN,0);  
  22.         if(ret>0){  
  23.             buf[ret]='/0';  
  24.             printf("server:recv buf=[%s]/n",buf);  
  25.         }else if(ret<0){  
  26.             printf("server:recv ret=[%d],errno=[%d]/n",ret,errno);  
  27.             break;  
  28.         }  
  29.         memset(buf,0,STRLEN);  
  30.         sprintf(buf,"HTTP/1.1 200 OK/r/nContent-Length: 2/r/nContent-Type: text/html;charset=gb2312/r/n/r/nok");  
  31.         ret=send(outfd,buf,strlen(buf),0);  
  32.         if(ret>0){  
  33.             printf("server:listend ret=[%d],buf=[%s]/n",ret,buf);  
  34.         }  
  35.         if(ret<0){  
  36.             printf("server:listend ret=[%d],errno=[%d]/n",ret,errno);  
  37.             break;  
  38.         }       
  39.        close(outfd);  
  40.     }  
  41.   
  42. }  
  43.   
  44.   
  45.   
  46.   
  47. int main()  
  48. {  
  49.     int sockefd,listend;  
  50.     int ret,i,addrlen;  
  51.     struct sockaddr_in my_addr;  
  52.     char buf[STRLEN];  
  53.     pthread_t thid;  
  54.       
  55.     sockefd=socket(AF_INET,SOCK_STREAM,0);  
  56.       
  57.     my_addr.sin_family=AF_INET;  
  58.     my_addr.sin_port=htons(MYPORT);  
  59.     my_addr.sin_addr.s_addr=inet_addr("192.168.0.102");  
  60.     bzero(&my_addr.sin_zero,8);  
  61.     
  62.     ret=bind(sockefd,(struct sockaddr*)&my_addr,sizeof(struct sockaddr_in));  
  63.     if(ret<0){  
  64.         printf("server:bind ret=[%d],errno=[%d]/n",ret,errno);  
  65.         return -1;  
  66.     }  
  67.       
  68.     ret=listen(sockefd,5);  
  69.     if(ret<0){  
  70.         printf("server:listen ret=[%d]/n",ret);  
  71.         return -1;  
  72.     }  
  73.       
  74.     while(1){  
  75.         addrlen=sizeof(struct sockaddr_in);  
  76.         listend=accept(sockefd,(struct sockaddr *)&my_addr,&addrlen);  
  77.   
  78.         if(listend==-1){  
  79.             printf("server:accept listend=[%d],errno=[%d]/n",listend,errno);  
  80.             return listend;  
  81.         }else{  
  82.             if(pthread_create(&thid,NULL,Recv,&listend)<0){  
  83.                 printf("create the %dth thread fail/n",i);  
  84.                 return -1;  
  85.             }  

                       pthread_join(thid);

  1.         }     
  2.     }  
  3.   
  4.     printf("server:exit/n");  
  5.     return 0;  
  6. }  

抱歉!评论已关闭.