linux 下实现服务器与客户端连接小例子

来源:互联网 发布:程序员猝死 知乎 编辑:程序博客网 时间:2024/06/05 10:06
[cpp] view plaincopy
  1. // 服务器端  
  2.   
  3.   
  4. /******* 服务器程序  (server.c) ************/  
  5. #include <stdlib.h>  
  6. #include <stdio.h>  
  7. #include <errno.h>  
  8. #include <string.h>  
  9. #include <unistd.h>  
  10. #include <netdb.h>  
  11. #include <sys/socket.h>  
  12. #include <netinet/in.h>  
  13. #include <sys/types.h>  
  14. #include <arpa/inet.h>  
  15.   
  16. int main(int argc, char *argv[])  
  17. {  
  18.         int sockfd,new_fd;  
  19.         struct sockaddr_in server_addr;  
  20.         struct sockaddr_in client_addr;  
  21.         int sin_size,portnumber;  
  22.         char hello[]="Hello! Are You Fine?\n";  
  23.   
  24.         if((portnumber=atoi("8080"))<0)  
  25.         {  
  26.                 fprintf(stderr,"Usage:%s portnumber\a\n",argv[0]);  
  27.                 exit(1);  
  28.         }  
  29.   
  30.         /* 服务器端开始建立socket描述符 */  
  31.         if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)  
  32.         {  
  33.                 fprintf(stderr,"Socket error:%s\n\a",strerror(errno));  
  34.                 exit(1);  
  35.         }  
  36.   
  37.         /* 服务器端填充 sockaddr结构  */  
  38.         bzero(&server_addr,sizeof(struct sockaddr_in));  
  39.         server_addr.sin_family=AF_INET;  
  40.         server_addr.sin_addr.s_addr=htonl(INADDR_ANY);  
  41.         server_addr.sin_port=htons(portnumber);  
  42.   
  43.         /* 捆绑sockfd描述符  */  
  44.         if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)  
  45.         {  
  46.                 fprintf(stderr,"Bind error:%s\n\a",strerror(errno));  
  47.                 exit(1);  
  48.         }  
  49.   
  50.         /* 监听sockfd描述符  */  
  51.         if(listen(sockfd,5)==-1)  
  52.         {  
  53.                 fprintf(stderr,"Listen error:%s\n\a",strerror(errno));  
  54.                 exit(1);  
  55.         }  
  56.   
  57.         while(1)  
  58.         {  
  59.             fprintf(stderr, "server is listening!\n");  
  60.   
  61.                 /* 服务器阻塞,直到客户程序建立连接  */  
  62.                 sin_size=sizeof(struct sockaddr_in);  
  63.                 if( ( new_fd = accept(sockfd,(struct sockaddr *)(&client_addr),(socklen_t*)&sin_size ) ) == -1)  
  64.                 {  
  65.                         fprintf(stderr,"Accept error:%s\n\a",strerror(errno));  
  66.                         exit(1);  
  67.                 }  
  68.   
  69.                 fprintf(stderr,"Server get connection from %s\n",  
  70.                 inet_ntoa(client_addr.sin_addr));  
  71.                 if(write(new_fd,hello,strlen(hello))==-1)  
  72.                 {  
  73.                         fprintf(stderr,"Write Error:%s\n",strerror(errno));  
  74.                         exit(1);  
  75.                 }  
  76.                 /* 这个通讯已经结束     */  
  77.                 close(new_fd);  
  78.                 /* 循环下一个     */  
  79.         }  
  80.         close(sockfd);  
  81.         exit(0);  
  82. }  

[cpp] view plaincopy
  1. /******* 客户端程序  client.c ************/  
  2. #include <stdlib.h>  
  3. #include <stdio.h>  
  4. #include <errno.h>  
  5. #include <string.h>  
  6. #include <unistd.h>  
  7. #include <netdb.h>  
  8. #include <sys/socket.h>  
  9. #include <netinet/in.h>  
  10. #include <sys/types.h>  
  11. #include <arpa/inet.h>  
  12.   
  13. int main(int argc, char *argv[])  
  14. {  
  15.         int sockfd;  
  16.         char buffer[1024];  
  17.         struct sockaddr_in server_addr;  
  18.         struct hostent *host;  
  19.         int portnumber,nbytes;  
  20.   
  21.         if((host=gethostbyname("10.1.39.93"))==NULL)  
  22.         {  
  23.                 fprintf(stderr,"Gethostname error\n");  
  24.                 exit(1);  
  25.         }  
  26.   
  27.         if((portnumber=atoi("8080"))<0)  
  28.         {  
  29.                 fprintf(stderr,"Usage:%s hostname portnumber\a\n",argv[0]);  
  30.                 exit(1);  
  31.         }  
  32.   
  33.         /* 客户程序开始建立 sockfd描述符  */  
  34.         if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)  
  35.         {  
  36.                 fprintf(stderr,"Socket Error:%s\a\n",strerror(errno));  
  37.                 exit(1);  
  38.         }  
  39.   
  40.         /* 客户程序填充服务端的资料       */  
  41.         bzero(&server_addr,sizeof(server_addr));  
  42.         server_addr.sin_family=AF_INET;  
  43.         server_addr.sin_port=htons(portnumber);  
  44.         server_addr.sin_addr=*((struct in_addr *)host->h_addr);  
  45.   
  46.         /* 客户程序发起连接请求         */  
  47.         if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)  
  48.         {  
  49.                 fprintf(stderr,"Connect Error:%s\a\n",strerror(errno));  
  50.                 exit(1);  
  51.         }  
  52.   
  53.         /* 连接成功了           */  
  54.         if((nbytes=read(sockfd,buffer,1024))==-1)  
  55.         {  
  56.                 fprintf(stderr,"Read Error:%s\n",strerror(errno));  
  57.                 exit(1);  
  58.         }  
  59.         buffer[nbytes]='\0';  
  60.         printf("I have received:%s\n",buffer);  
  61.         /* 结束通讯     */  
  62.         close(sockfd);  
  63.         exit(0);  

原创粉丝点击