首先介绍TCP通信基本流程,包括服务器端的套接字创建、绑定、监听、接受连接及数据收发,以及客户端的连接建立与数据交互;接着通过回声服务器和客户端示例代码展示具体实现,服务器接收客户端消息并原样返回;最后说明编译运行方法,使用gcc编译后先启动服务器再运行客户端进行测试,输入“exit”退出,为后续多客户端、文件传输等扩展应用奠定基础。

开发TCP网络程序是Linux系统编程中的基础技能,常用于实现客户端与服务器之间的可靠通信。通过使用Socket API,可以快速构建基于TCP协议的网络应用。下面以一个简单的回声(Echo)服务器和客户端为例,说明如何在Linux下编写TCP网络程序。
1. TCP通信基本流程
在Linux中,TCP通信通常分为服务器端和客户端两部分:
服务器端流程:
- 创建套接字(socket)
- 绑定地址和端口(bind)
- 监听连接请求(listen)
- 接受客户端连接(accept)
- 接收和发送数据(recv/send)
- 关闭连接(close)
客户端流程:
- 创建套接字(socket)
- 连接服务器(connect)
- 发送和接收数据(send/recv)
- 关闭连接(close)
2. 示例:TCP回声服务器
#include#include #include #include #include #include define PORT 8888
define BUFFER_SIZE 1024
int main() { int server_fd, client_fd; struct sockaddr_in server_addr, client_addr; socklen_t client_len = sizeof(client_addr); char buffer[BUFFER_SIZE];
// 创建套接字 if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("socket"); exit(EXIT_FAILURE); } // 配置服务器地址 memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(PORT); server_addr.sin_addr.s_addr = INADDR_ANY; // 绑定 if (bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) { perror("bind"); close(server_fd); exit(EXIT_FAILURE); } // 监听 if (listen(server_fd, 5) == -1) { perror("listen"); close(server_fd); exit(EXIT_FAILURE); } printf("服务器正在监听端口 %d...\n", PORT); // 接受连接 client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &client_len); if (client_fd == -1) { perror("accept"); close(server_fd); exit(EXIT_FAILURE); } printf("客户端已连接\n"); // 循环读取并回传数据 while (1) { ssize_t len = recv(client_fd, buffer, BUFFER_SIZE - 1, 0); if (len > 0) { buffer[len] = '\0'; printf("收到: %s", buffer); send(client_fd, buffer, len, 0); } else { break; // 客户端断开 } } printf("客户端断开连接\n"); close(client_fd); close(server_fd); return 0;}
BJXSHOP网上购物系统 - 书店版下载BJXSHOP购物管理系统是一个功能完善、展示信息丰富的电子商店销售平台;针对企业与个人的网上销售系统;开放式远程商店管理;完善的订单管理、销售统计、结算系统;强力搜索引擎支持;提供网上多种在线支付方式解决方案;强大的技术应用能力和网络安全系统 BJXSHOP网上购物系统 - 书店版,它具备其他通用购物系统不同的功能,有针对图书销售而进行开发的一个电子商店销售平台,如图书ISBN,图书目录
3. 示例:TCP客户端
#include#include #include #include #include #include #include define SERVER_IP "127.0.0.1"
define PORT 8888
define BUFFER_SIZE 1024
int main() { int sock; struct sockaddr_in server_addr; char send_buf[100], recv_buf[BUFFER_SIZE];
// 创建套接字 if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("socket"); exit(EXIT_FAILURE); } // 设置服务器地址 memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(PORT); inet_pton(AF_INET, SERVER_IP, &server_addr.sin_addr); // 连接服务器 if (connect(sock, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) { perror("connect"); close(sock); exit(EXIT_FAILURE); } printf("已连接到服务器\n"); // 发送消息并接收回声 while (1) { printf("输入消息: "); fgets(send_buf, sizeof(send_buf), stdin); if (strcmp(send_buf, "exit\n") == 0) { break; } send(sock, send_buf, strlen(send_buf), 0); ssize_t len = recv(sock, recv_buf, BUFFER_SIZE - 1, 0); if (len > 0) { recv_buf[len] = '\0'; printf("回声: %s\n", recv_buf); } } close(sock); printf("连接已关闭\n"); return 0;}
4. 编译与运行
将服务器代码保存为 tcp_server.c,客户端保存为 tcp_client.c,然后使用gcc编译:
gcc -o server tcp_server.c
gcc -o client tcp_client.c
先运行服务器:
./server
再打开另一个终端运行客户端:
./client
在客户端输入内容,服务器会原样返回,输入 "exit" 可退出客户端。
基本上就这些。掌握这个模型后,可以扩展为多客户端支持(使用fork或多线程)、文件传输、聊天室等应用。关键是理解Socket的创建、连接、数据读写和错误处理机制。









