NSX
回答者
回答于 2026-10-19
使用C语言在局域网内实现两台电脑的TCP通信,核心是调用操作系统提供的Socket API(如POSIX标准或Windows Winsock)。需要分别编写服务端程序和客户端程序。
实现步骤
服务端程序
- 创建套接字:调用
socket()函数,参数指定为AF_INET(IPv4)和SOCK_STREAM(TCP流式套接字)。 - 绑定地址:构造
sockaddr_in结构体,填入本机局域网IP地址(或使用INADDR_ANY监听所有网卡)及指定端口号,调用bind()绑定。 - 监听连接:调用
listen()将套接字设为被动监听状态。 - 接受连接:调用
accept()阻塞等待客户端连接,成功后返回一个新的已连接套接字用于通信。 - 收发数据:使用
recv()/read()接收数据,send()/write()发送数据。 - 关闭连接:通信结束后调用
close()(Linux/macOS)或closesocket()(Windows)释放资源。
客户端程序
- 创建套接字:同样调用
socket()创建TCP套接字。 - 发起连接:构造
sockaddr_in结构体,填入服务端的局域网IP地址和监听端口,调用connect()发起连接请求。 - 收发数据:连接建立后,使用
send()/recv()与服务端交互。 - 关闭连接:完成后关闭套接字。
适用条件
- 两台电脑处于同一局域网且网络互通(可通过
ping命令验证)。 - 服务端所在主机的防火墙需放行所使用的端口。
- Windows平台需在代码开头引入
<winsock2.h>并在程序初始化时调用WSAStartup(),链接时需附加ws2_32.lib;Linux/macOS平台直接使用<sys/socket.h>、<netinet/in.h>等头文件即可。
常见误区
- 字节序问题:网络传输使用大端字节序,填充端口号和IP地址时必须使用
htons()和inet_pton()(或inet_addr())进行转换,否则会导致连接失败。 - 未处理粘包:TCP是面向字节流的协议,不保证消息边界,多次
send()的数据可能在一次recv()中同时读出,应用层需自行设计协议分隔符或长度字段来处理粘包与拆包。 - 忽略返回值:
send()和recv()的返回值表示实际发送或接收的字节数,可能小于请求的长度,循环处理是必要的。