Linux网络编程之套接字


套接字可以让Linux在网络上通信,用起来就像管道一样,当然管道都是单向的,套接字既能写也能收!

以下是多客户服务器代码:

  1. #include <stdio.h>   
  2. #include <stdlib.h>   
  3. #include <unistd.h>   
  4. #include <sys/types.h>   
  5. #include <sys/socket.h>   
  6. #include <signal.h>   
  7. #include <arpa/inet.h>   
  8. #include <string.h>   
  9. #define PORT 6000   
  10. #define SIZE 256   
  11.   
  12. static void handler()//回收子进程函数   
  13. {  
  14.     wait(NULL);  
  15. }  
  16.   
  17. int main(int argc, char **argv)  
  18. {  
  19.     int server_socketfd;  
  20.     int client_socketfd;  
  21.     int ret;  
  22.     pid_t pid;  
  23.     size_t address_len;  
  24.     struct sockaddr_in server_address;  
  25.     struct sockaddr_in client_address;  
  26.       
  27.     server_socketfd = socket(AF_INET, SOCK_STREAM,0);//创建一个套接字   
  28.       
  29.     memset(&server_address,0,sizeof(struct sockaddr_in));  
  30.       
  31.     server_address.sin_family = AF_INET;//协议族设置为ARPA因特网协议   
  32.     server_address.sin_port = htons(PORT);//端口号设为PORT(6000)   
  33.     server_address.sin_addr.s_addr = htonl(INADDR_ANY);//允许任何客户端可以连接   
  34.     address_len = sizeof(struct sockaddr_in);  
  35.   
  36.     ret = bind(server_socketfd, (struct sockaddr*)&server_address, address_len);//将创建的套接字和address中的地址绑定在一起   
  37.     if( ret == -1 )  
  38.     {  
  39.         printf("bind failed!\n");  
  40.         exit(0);  
  41.     }  
  42.       
  43.     ret = listen(server_socketfd, 5);//创建一个监听5个请求的队列,也就是说这个服务器允许5个人同时登入   
  44.     if ( ret == -1 )  
  45.     {  
  46.         printf("listen failed!\n");  
  47.         exit(0);  
  48.     }  
  49.       
  50.     while (1)  
  51.     {  
  52.         client_socketfd = accept(server_socketfd, (struct sockaddr*)&client_address, &address_len);//客户连接服务器时建立客户套接字   
  53.   
  54.         signal(SIGCHLD,handler);//为了避免子进程结束时造成僵尸进程,需要对结束子进程作处理,handler函数负责回收子进程   
  55.   
  56.         pid = fork();  
  57.         if (pid == 0)//为客户分配的子进程   
  58.         {  
  59.             char buffer[256];  
  60.             int nread;  
  61.             nread = read(client_socketfd,buffer,sizeof(buffer));  
  62.             printf("%s",buffer);  
  63.                   
  64.         }  
  65.         else if (pid > 0)//父进程把分配的客户套接字关闭,用来供给下个客户   
  66.         {  
  67.             close(client_socketfd);//关闭客户套接字   
  68.         }  
  69.         else  
  70.         {  
  71.             printf("fork faild!\n");  
  72.             exit(0);  
  73.         }  
  74.     }  
  75.     return 0;  
  76. }  

客户端代码:

  1. #include <stdio.h>   
  2. #include <stdlib.h>   
  3. #include <unistd.h>   
  4. #include <sys/types.h>   
  5. #include <sys/socket.h>   
  6. #include <netinet/in.h>   
  7. #include <arpa/inet.h>   
  8. #include <string.h>   
  9.   
  10. #define SIZE 256   
  11. #define PORT 6000   
  12.   
  13. int main()  
  14. {  
  15.     int socketfd;  
  16.     int ret;  
  17.     char buffer[SIZE];  
  18.     struct sockaddr_in address;  
  19.   
  20.     socketfd = socket(AF_INET, SOCK_STREAM, 0);//创建一个套接字   
  21.   
  22.     address.sin_family = AF_INET;//设置为因特网协议   
  23.     address.sin_port = htons(PORT);//设置端口号   
  24.     inet_pton(AF_INET, "127.0.0.1", &address.sin_addr.s_addr);//设置ip地址   
  25.   
  26.     ret = connect(socketfd, (struct sockaddr*) &address, sizeof(address));//连接服务器   
  27.   
  28.     if (ret == -1)  
  29.     {  
  30.         printf("can't connect!\n");  
  31.         exit(0);  
  32.     }  
  33.           
  34.     printf("send:");  
  35.     fgets(buffer,sizeof(buffer),stdin);  
  36.     write(socketfd,buffer,sizeof(buffer));//把数据传给服务器   
  37.   
  38.     close(socketfd);//关闭套接字   
  39.     return 0;  
  40. }  

相关内容