手机版
你好,游客 登录 注册
背景:
阅读新闻

Linux下的TCP通信

[日期:2012-06-02] 来源:Linux社区  作者:htttw [字体: ]

今天我们介绍如何编写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文件


程序运行的结果如下图:

linux
相关资讯       Linux编程  Linux TCP编程 
本文评论   查看全部评论 (1)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款
第 1 楼
* stayor 发表于 2013/11/29 13:16:16
很好的学习材料。