歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Linux下的TCP通信

Linux下的TCP通信

日期:2017/3/1 10:20:53   编辑:Linux編程

今天我們介紹如何編寫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. clean:
  5. 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. int main()
  8. {
  9. /* delete the socket file */
  10. unlink("server_socket");
  11. /* create a socket */
  12. int server_sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
  13. struct sockaddr_un server_addr;
  14. server_addr.sun_family = AF_UNIX;
  15. strcpy(server_addr.sun_path, "server_socket");
  16. /* bind with the local file */
  17. bind(server_sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));
  18. /* listen */
  19. listen(server_sockfd, 5);
  20. char ch;
  21. int client_sockfd;
  22. struct sockaddr_un client_addr;
  23. socklen_t len = sizeof(client_addr);
  24. while(1)
  25. {
  26. printf("server waiting:\n");
  27. /* accept a connection */
  28. client_sockfd = accept(server_sockfd, (struct sockaddr *)&client_addr, &len);
  29. /* exchange data */
  30. read(client_sockfd, &ch, 1);
  31. printf("get char from client: %c\n", ch);
  32. ++ch;
  33. write(client_sockfd, &ch, 1);
  34. /* close the socket */
  35. close(client_sockfd);
  36. }
  37. return 0;
  38. }

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. int main()
  8. {
  9. /* create a socket */
  10. int sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
  11. struct sockaddr_un address;
  12. address.sun_family = AF_UNIX;
  13. strcpy(address.sun_path, "server_socket");
  14. /* connect to the server */
  15. int result = connect(sockfd, (struct sockaddr *)&address, sizeof(address));
  16. if(result == -1)
  17. {
  18. perror("connect failed: ");
  19. exit(1);
  20. }
  21. /* exchange data */
  22. char ch = 'A';
  23. write(sockfd, &ch, 1);
  24. read(sockfd, &ch, 1);
  25. printf("get char from server: %c\n", ch);
  26. /* close the socket */
  27. close(sockfd);
  28. return 0;
  29. }

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

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


程序運行的結果如下圖:

Copyright © Linux教程網 All Rights Reserved