Linux下基于TCP简单的Socket通信程序


服务器端程序:
  1.     #include <stdio.h>    
  2.     #include <stdlib.h>    
  3.     #include <strings.h>    
  4.     #include <sys/types.h>    
  5.     #include <sys/socket.h>    
  6.     #include <unistd.h>    
  7.     #include <arpa/inet.h>    
  8.     #include <netinet/in.h>    
  9.     #include <string.h>    
  10.     #include <errno.h>    
  11.     #define PORT 2370    
  12.     #define BACKLOG 2    
  13.     #define IP "192.168.1.12"    
  14.     void process_conn_server(int s,char * ip);    
  15.         
  16.     int main(int argc,char *argv[])    
  17.     {    
  18.       int ss,sc;    
  19.       struct sockaddr_in server_addr;    
  20.        struct sockaddr_in client_addr;    
  21.       int err;    
  22.       pid_t pid;    
  23.         
  24.       //创建套接字     
  25.       ss=socket(AF_INET,SOCK_STREAM,0);    
  26.       if(ss<0)    
  27.        {    
  28.          printf("socket error\n");    
  29.          return -1;    
  30.        }    
  31.         
  32.       //设置服务器端的地址,端口等     
  33.       server_addr.sin_family = AF_INET;                                   
  34.       server_addr.sin_port = htons(PORT);                    
  35.       server_addr.sin_addr.s_addr = INADDR_ANY;                
  36.       bzero(&(server_addr.sin_zero), 8);      
  37.       //将创建的套接字绑定到服务器端                               
  38.       err = bind(ss, (struct sockaddr *)&server_addr, sizeof(struct sockaddr));     
  39.      if(err<0)    
  40.        {    
  41.          printf("bind error\n");    
  42.          return -1;    
  43.        }    
  44.         
  45.       //监听套接字     
  46.       err=listen(ss,BACKLOG);    
  47.       if(err<0)    
  48.        {    
  49.          printf("listen error\n");    
  50.          return -1;    
  51.        }    
  52.         
  53.       //主循环程序     
  54.       for(;;)    
  55.        {    
  56.          int addrlen=sizeof(struct sockaddr);    
  57.          sc=accept(ss,(struct sockaddr*)&client_addr,&addrlen);//如果调用成功,www.bkjia.com将返回一个新的套接字与客户端通信     
  58.          printf("%s has connected success\n",inet_ntoa(client_addr.sin_addr));    
  59.          if(sc<0)    
  60.           {    
  61.             continue;    
  62.           }    
  63.          pid=fork();//创建一个进程与客户端通信     
  64.          if(pid==0)    
  65.           {    
  66.             close(ss);//为了避免影响,在子进程中关闭父进程套接字,父进程关闭子进程的套接字(并没有真正的关闭,只是让它们不相互影响)     
  67.             process_conn_server(sc,inet_ntoa(client_addr.sin_addr));//调用子进程通信函数     
  68.           }    
  69.          else    
  70.           {    
  71.             close(sc);    
  72.           }    
  73.        }    
  74.     }    
  75.         
  76.     void process_conn_server(int s,char *ip)    
  77.     {    
  78.           
  79.       char buffer[1024];    
  80.          
  81.       while(1)    
  82.       {    
  83.        memset(buffer,'\0',1024); //置空     
  84.        recv(s,buffer,1024,0);//接收消息www.bkjia.com     
  85.        if(strncmp("end",buffer,3)==0)//判断是否符合退出条件     
  86.        {   
  87.        printf("%s has lost connect\n",ip);   
  88.        close(s);    
  89.        exit(EXIT_SUCCESS);    
  90.        }    
  91.        printf("%s say :%s\n",ip,buffer);    
  92.            
  93.         
  94.        //统计客户端输出的字符个数并发送给客户端     
  95.         
  96.       sprintf(buffer,"%d characters altogether",strlen(buffer)-1);     
  97.        send(s,buffer,1024,0);     
  98.     }    
  99.     }    
  100.     
  • 1
  • 2
  • 下一页

相关内容