xilu168
回答者
回答于 2026-10-24
在C语言中实现TCP客户端与服务器通信,需使用POSIX标准(Linux/macOS)或Winsock(Windows)提供的Socket API。TCP是面向连接的协议,通信前必须先建立连接。
服务器端步骤
- 创建套接字:调用
socket(AF_INET, SOCK_STREAM, 0),其中AF_INET表示IPv4,SOCK_STREAM表示TCP流式传输。 - 绑定地址:初始化
struct sockaddr_in结构体,设置IP和端口,调用bind()将套接字与本地地址绑定。 - 监听连接:调用
listen(sockfd, backlog)使套接字进入被动监听状态,backlog指定等待队列最大长度。 - 接受连接:调用
accept()阻塞等待客户端连接,成功后返回一个新的已连接套接字用于数据传输。 - 收发数据:使用
recv()和send()(或read()/write())在新套接字上进行通信。 - 关闭套接字:通信结束后调用
close()(Windows下为closesocket())释放资源。
客户端步骤
- 创建套接字:同样调用
socket(AF_INET, SOCK_STREAM, 0)。 - 发起连接:填充服务器的
struct sockaddr_in信息,调用connect()向服务器发起三次握手。 - 收发数据:连接建立后,使用
send()和recv()与服务器通信。 - 关闭套接字:调用
close()断开连接。
适用条件
- Linux/macOS环境下需包含
<sys/socket.h>、<netinet/in.h>、<arpa/inet.h>等头文件。 - Windows环境下需包含
<winsock2.h>,并在程序开头调用WSAStartup()初始化,结束时调用WSACleanup()。
常见误区
- 混淆套接字描述符:服务器端
accept()返回的新套接字用于通信,原始监听套接字仅用于接收新连接,两者不可混用。 - 忽略字节序转换:网络传输使用大端字节序,赋值端口和IP时必须使用
htons()和inet_pton()(或inet_addr())进行转换。 - 未处理返回值:
send()和recv()的返回值可能小于请求的字节数,需在循环中处理直到所有数据发送或接收完毕。 - 忘记关闭资源:异常退出时未关闭套接字会导致文件描述符泄漏或端口被占用。