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

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