歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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.linuxidc.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.linuxidc.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.     
Copyright © Linux教程網 All Rights Reserved