网络编程——TCP
- 电脑硬件
- 2025-09-14 16:42:01

在Linux系统上使用C语言进行网络编程时,TCP(Transmission Control Protocol)是最常用的协议之一,它提供了可靠、面向连接的数据传输服务。下面是关于如何使用C语言在Linux系统中进行TCP网络编程的详细步骤与示例。
基本步骤
1.创建套接字 (Socket)
使用 socket() 系统调用创建套接字,指定协议族(AF_INET)和协议类(SOCK_STREAM,表示TCP)。
2.绑定地址和端口 (Bind)
在服务器端,使用 bind() 将套接字与特定的IP地址和端口号绑定。
3.监听连接 (Listen)
服务器使用 listen() 函数进入监听状态,等待客户端的连接请求。
4.接受连接 (Accept)
服务器端使用 accept() 接受客户端的连接请求,并返回一个新的套接字用于与客户端通信。
5.建立连接 (Connect)
客户端使用 connect() 发起连接请求,向服务器发送连接请求。
6.数据传输 (Send/Recv)
连接建立后,双方可以使用 send() 和 recv() 进行数据的发送和接收。
7.关闭连接 (Close)
数据传输完成后,双方需要通过 close() 关闭套接字,释放资源。
示例代码 服务器端代码 服务器端代码需要进行以下操作:
创建套接字 绑定IP地址和端口 监听客户端连接请求 接受客户端连接并进行数据交互 关闭连接
#include "public.h" int init_udp_ser(const char *ip, unsigned short port) { struct sockaddr_in seraddr; seraddr.sin_family = AF_INET; seraddr.sin_port = htons(port); seraddr.sin_addr.s_addr = inet_addr(ip); int sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { perror("fail socket"); return -1; } int ret = bind(sockfd, (struct sockaddr *)&seraddr, sizeof(seraddr)); if (ret < 0) { perror("fail bind"); return -1; } return sockfd; } int main(int argc, const char *argv[]) { char buff[512] = {0}; int sockfd = init_udp_ser("192.168.1.139", 50000); if (sockfd < 0) { return -1; } int ret = listen(sockfd, 2); if (ret < 0) { perror("fail listen"); return -1; } int connfd = accept(sockfd, NULL, NULL); if (connfd < 0) { perror("fail accept"); return -1; } pid_t pid = fork(); if (pid < 0) { perror("fail fork"); return -1; } if (0 == pid) { while (1) { memset(buff, 0, sizeof(buff)); ssize_t size = recv(connfd, buff, sizeof(buff), 0); if (size == 0) { break; } printf("%s\n", buff); } } else if (pid > 0) { while (1) { memset(buff, 0, sizeof(buff)); fgets(buff, sizeof(buff), stdin); ssize_t size = send(connfd, buff, strlen(buff), 0); if (size < 0) { perror("fail send"); return -1; } } } close(sockfd); close(connfd); return 0; }客户端代码 客户端代码需要进行以下操作:
创建套接字 连接到服务器 发送数据并接收回应 关闭连接
#include "public.h" int init_tcp_cli() { int sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { perror("fail socket"); return -1; } return sockfd; } int main(int argc, const char *argv[]) { int sockfd = init_tcp_cli(); if (sockfd < 0) { return -1; } char buff[512] = {0}; struct sockaddr_in seraddr; seraddr.sin_family = AF_INET; seraddr.sin_port = htons(50000); seraddr.sin_addr.s_addr = inet_addr("192.168.1.139"); int ret = connect(sockfd, (struct sockaddr *)&seraddr, sizeof(seraddr)); if (ret < 0) { perror("fail connect"); return -1; } pid_t pid = fork(); if (pid < 0) { perror("fail fork"); return -1; } if (0 == pid) { while (1) { memset(buff, 0, sizeof(buff)); fgets(buff, sizeof(buff), stdin); ssize_t size = send(sockfd, buff, strlen(buff), 0); if (size < 0) { perror("fail send"); return -1; } } } if (pid > 0) { while (1) { memset(buff, 0, sizeof(buff)); ssize_t size = recv(sockfd, buff, sizeof(buff), 0); if (size == 0) { break; } printf("RECV:%s\n", buff); } } close(sockfd); return 0; }详细解释
创建套接字:
socket(AF_INET, SOCK_STREAM, 0)
创建一个TCP套接字,其中AF_INET表示IPv4协议族,SOCK_STREAM表示流式套接字(TCP协议)。
绑定地址和端口:
bind()将服务器的套接字与指定的IP地址和端口绑定。
监听连接:
listen()使服务器进入监听状态,准备接受客户端的连接请求。
接受连接:
accept()用于接收客户端的连接请求,并返回一个新的套接字,这个新的套接字用于与客户端的数据交互。
建立连接:
客户端通过connect()函数连接到服务器,指定目标服务器的IP和端口。
数据传输:
服务器和客户端使用send()函数发送数据,使用recv()函数接收数据。
关闭连接:
close()用于关闭套接字,释放系统资源。
注意事项
1.错误处理:示例代码中的 perror() 函数用于在系统调用失败时输出错误信息。 2.网络字节序:端口号、IP地址等使用网络字节序(大端序)。通过 htons() 和 htonl() 将主机字节序转换为网络字节序。
总结 通过上面的示例代码,我们可以使用C语言在Linux环境下进行TCP网络编程。TCP协议提供了可靠的、面向连接的通信机制,适用于需要数据可靠传输的应用程序。在实际开发中,需要根据具体的业务需求来处理数据传输、错误处理、连接管理等问题。