一步一步学Linux C:Socket实例


客户端:

  1. #include <stdio.h>   
  2. #include <sys/socket.h>   
  3. #include <unistd.h>   
  4. #include <sys/types.h>   
  5. #include <netinet/in.h>   
  6. #include <stdlib.h>    
  7.   
  8.   
  9. #define  SERVER_PORT 20000  //  define the defualt connect port id    
  10. #define  CLIENT_PORT ((20001+rand())%65536)  //  define the defualt client port as a random port    
  11. #define  BUFFER_SIZE 255    
  12. #define  REUQEST_MESSAGE "welcome to connect the server.\n"    
  13.   
  14.   
  15. void  usage(char* name)  
  16. {  
  17.        printf( " usage: %s IpAddr\n " ,name);  
  18. }  
  19.   
  20.   
  21. int  main(int argc, char** argv)  
  22. {  
  23.        int  servfd,clifd,length = 0;  
  24.        struct  sockaddr_in servaddr,cliaddr;  
  25.        socklen_t socklen  =   sizeof (servaddr);  
  26.        char  buf[BUFFER_SIZE];  
  27.   
  28.         if (argc < 2 )  
  29.          {  
  30.               usage(argv[ 0 ]);  
  31.               exit( 1 );  
  32.        }   
  33.   
  34.        if ((clifd  =  socket(AF_INET,SOCK_STREAM, 0 ))  <   0 )  
  35.          {  
  36.              printf( " create socket error!\n " );  
  37.              exit( 1 );  
  38.        }   
  39.    
  40.        srand(time(NULL)); // initialize random generator    
  41.    
  42.        bzero( & cliaddr, sizeof (cliaddr));  
  43.        cliaddr.sin_family  =  AF_INET;  
  44.        cliaddr.sin_port  =  htons(CLIENT_PORT);  
  45.        cliaddr.sin_addr.s_addr  =  htons(INADDR_ANY);  
  46.   
  47.        bzero( & servaddr, sizeof (servaddr));  
  48.        servaddr.sin_family  =  AF_INET;  
  49.        inet_aton(argv[ 1 ], & servaddr.sin_addr);  
  50.        servaddr.sin_port  =  htons(SERVER_PORT);  
  51.       // servaddr.sin_addr.s_addr = htons(INADDR_ANY);    
  52.   
  53.        if  (bind(clifd, (struct sockaddr* ) &cliaddr, sizeof (cliaddr)) < 0 )  
  54.        {  
  55.               printf( " bind to port %d failure!\n " ,CLIENT_PORT);  
  56.               exit( 1 );  
  57.        }   
  58.   
  59.         if (connect(clifd,( struct  sockaddr * ) & servaddr, socklen)  <   0 )  
  60.        {  
  61.               printf( " can't connect to %s!\n ", argv[ 1 ]);  
  62.               exit( 1 );  
  63.        }   
  64.   
  65.        length  =  recv(clifd, buf, BUFFER_SIZE, 0);  
  66.         if  (length < 0)  
  67.         {  
  68.               printf( " error comes when recieve data from server %s! ", argv[1] );  
  69.               exit( 1 );  
  70.        }   
  71.   
  72.        printf( " from server %s :\n\t%s", argv[1], buf);  
  73.   
  74.        close(clifd);  
  75.        return 0;  
  76. }   
服务器端:
  1. #include  <stdio.h>    
  2. #include  <sys/socket.h>    
  3. #include  <unistd.h>    
  4. #include  <sys/types.h>    
  5. #include  <netinet/in.h>    
  6. #include  <stdlib.h>    
  7. #include  <time.h>    
  8.    
  9. #define  SERVER_PORT 20000  //  define the defualt connect port id    
  10. #define  LENGTH_OF_LISTEN_QUEUE 10  // length of listen queue in server    
  11. #define  BUFFER_SIZE 255    
  12. #define  WELCOME_MESSAGE "welcome to connect the server. "    
  13.   
  14. int main(int argc, char** argv)  
  15. {  
  16.        int  servfd,clifd;  
  17.        struct  sockaddr_in servaddr,cliaddr;  
  18.   
  19.        if  ((servfd  =  socket(AF_INET,SOCK_STREAM, 0 ))  <   0 )  
  20.          {  
  21.               printf( " create socket error!\n " );  
  22.               exit( 1 );  
  23.        }   
  24.    
  25.        bzero( & servaddr, sizeof (servaddr));  
  26.   
  27.        servaddr.sin_family  =  AF_INET;  
  28.        servaddr.sin_port  =  htons(SERVER_PORT);  
  29.        servaddr.sin_addr.s_addr  =  htons(INADDR_ANY);  
  30.   
  31.        if  (bind(servfd,( struct  sockaddr * ) & servaddr, sizeof (servaddr)) < 0 )  
  32.          {  
  33.               printf( " bind to port %d failure!\n " ,SERVER_PORT);  
  34.               exit( 1 );  
  35.        }   
  36.    
  37.         if  (listen(servfd,LENGTH_OF_LISTEN_QUEUE)  <   0 )  
  38.          {  
  39.               printf( " call listen failure!\n " );  
  40.               exit( 1 );  
  41.        }   
  42.    
  43.         while  ( 1 )  
  44.          { // server loop will nerver exit unless any body kill the process    
  45.   
  46.               char  buf[BUFFER_SIZE];  
  47.               long  timestamp;  
  48.               socklen_t length  =   sizeof (cliaddr);  
  49.               clifd  =  accept(servfd,( struct  sockaddr * ) & cliaddr, & length);  
  50.   
  51.                if  (clifd  <   0 )  
  52.                 {  
  53.                      printf( " error comes when call accept!\n " );  
  54.                      break ;  
  55.               }   
  56.    
  57.               strcpy(buf,WELCOME_MESSAGE);  
  58.   
  59.                // inet_ntop(INET_ADDRSTRLEN,cliaddr.sin_addr,buf,BUFFER_SIZE);    
  60.   
  61.               printf( " from client,IP:%s,Port:%d\n " ,inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port));  
  62.   
  63.               timestamp  =  time(NULL);  
  64.   
  65.               strcat(buf, " timestamp in server: " );  
  66.               strcat(buf,ctime( & timestamp));  
  67.   
  68.               send(clifd,buf,BUFFER_SIZE, 0 );  
  69.   
  70.               close(clifd);             
  71.   
  72.        } // exit    
  73.    
  74.        close(servfd);  
  75.   
  76.         return   0 ;  
  77. }  

相关内容