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

Linux下的TCP通信

今天我們介紹如何編寫Linux下的TCP程序,關於UDP程序可以參考這裡:http://www.linuxidc.com/Linux/2012-06/61801.htm

本文絕大部分是參考《Linux程序設計(第4版)》的第15章套接字

《Linux程序設計》第四版中文版PDF下載見 http://www.linuxidc.com/Linux/2011-08/41135.htm

服務器端的步驟如下:

1. socket:      建立一個socket

2. bind:          將這個socket綁定在某個文件上(AF_UNIX)或某個端口上(AF_INET),我們會分別介紹這兩種。

3. listen:        開始監聽

4. accept:      如果監聽到客戶端連接,則調用accept接收這個連接並同時新建一個socket來和客戶進行通信

5. read/write:讀取或發送數據到客戶端

6. close:        通信完成後關閉socket

客戶端的步驟如下:

1. socket:      建立一個socket

2. connect:   主動連接服務器端的某個文件(AF_UNIX)或某個端口(AF_INET)

3. read/write:如果服務器同意連接(accept),則讀取或發送數據到服務器端

4. close:        通信完成後關閉socket

上面是整個流程,我們先給出一個例子,具體分析會在之後給出。例子實現的功能是客戶端發送一個字符到服務器,服務器將這個字符+1後送回客戶端,客戶端再把它打印出來

Makefile:

  1. all: tcp_client.c tcp_server.c  
  2.     gcc -g -Wall -o tcp_client tcp_client.c  
  3.     gcc -g -Wall -o tcp_server tcp_server.c  
  4.   
  5. clean:  
  6.     rm -rf *.o tcp_client tcp_server  

tcp_server.c:

  1. #include <sys/types.h>   
  2. #include <sys/socket.h>   
  3. #include <sys/un.h>   
  4. #include <unistd.h>   
  5. #include <stdlib.h>   
  6. #include <stdio.h>   
  7.   
  8. int main()  
  9. {  
  10.   /* delete the socket file */  
  11.   unlink("server_socket");  
  12.     
  13.   /* create a socket */  
  14.   int server_sockfd = socket(AF_UNIX, SOCK_STREAM, 0);  
  15.     
  16.   struct sockaddr_un server_addr;  
  17.   server_addr.sun_family = AF_UNIX;  
  18.   strcpy(server_addr.sun_path, "server_socket");  
  19.     
  20.   /* bind with the local file */  
  21.   bind(server_sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));  
  22.     
  23.   /* listen */  
  24.   listen(server_sockfd, 5);  
  25.     
  26.   char ch;  
  27.   int client_sockfd;  
  28.   struct sockaddr_un client_addr;  
  29.   socklen_t len = sizeof(client_addr);  
  30.   while(1)  
  31.   {  
  32.     printf("server waiting:\n");  
  33.       
  34.     /* accept a connection */  
  35.     client_sockfd = accept(server_sockfd, (struct sockaddr *)&client_addr, &len);  
  36.       
  37.     /* exchange data */  
  38.     read(client_sockfd, &ch, 1);  
  39.     printf("get char from client: %c\n", ch);  
  40.     ++ch;  
  41.     write(client_sockfd, &ch, 1);  
  42.       
  43.     /* close the socket */  
  44.     close(client_sockfd);  
  45.   }  
  46.     
  47.   return 0;  
  48. }  

tcp_client.c:

  1. #include <sys/types.h>   
  2. #include <sys/socket.h>   
  3. #include <sys/un.h>   
  4. #include <unistd.h>   
  5. #include <stdlib.h>   
  6. #include <stdio.h>   
  7.   
  8. int main()  
  9. {  
  10.   /* create a socket */  
  11.   int sockfd = socket(AF_UNIX, SOCK_STREAM, 0);  
  12.     
  13.   struct sockaddr_un address;  
  14.   address.sun_family = AF_UNIX;  
  15.   strcpy(address.sun_path, "server_socket");  
  16.     
  17.   /* connect to the server */  
  18.   int result = connect(sockfd, (struct sockaddr *)&address, sizeof(address));  
  19.   if(result == -1)  
  20.   {  
  21.     perror("connect failed: ");  
  22.     exit(1);  
  23.   }  
  24.     
  25.   /* exchange data */  
  26.   char ch = 'A';  
  27.   write(sockfd, &ch, 1);  
  28.   read(sockfd, &ch, 1);  
  29.   printf("get char from server: %c\n", ch);  
  30.     
  31.   /* close the socket */  
  32.   close(sockfd);  
  33.     
  34.   return 0;  
  35. }  

如果我們首先運行tcp_client,會提示沒有這個文件:

因為我們是以AF_UNIX方式進行通信的,這種方式是通過文件來將服務器和客戶端連接起來的,因此我們應該先運行tcp_server,創建這個文件,默認情況下,這個文件會創建在當前目錄下,並且第一個s表示它是一個socket文件


程序運行的結果如下圖:

Copyright © Linux教程網 All Rights Reserved