VC++ 实现的 TCP Socket 客户端与服务端示例
本文分享基于 Windows 平台的 VC++ (C++) TCP Socket 网络通信实例。通过 WinSock2.h 标准库,分别给出服务端(Server)监听接收数据与客户端(Client)发起请求的完整源代码,涵盖从库初始化、套接字创建到断开连接的全过程。
TCP 服务端核心逻辑
服务端程序主要任务是创建一个监听套接字,绑定特定端口(本例为 6000),并持续接受来自客户端的连接请求。以下是完整的 Tcp Server 代码实现:
#include <WinSock2.h>
#include <stdio.h>
#pragma comment(lib, "ws2_32.lib")
int main()
{
// 1. 初始化 Windows Sockets DLL
WORD wVerisonRequested;
WSADATA wsaData;
int err;
wVerisonRequested = MAKEWORD(1, 1);
err = WSAStartup(wVerisonRequested, &wsaData);
if (err != 0)
{
return -1;
}
// 2. 创建流式套接字 (TCP)
SOCKET sockServer = socket(AF_INET, SOCK_STREAM, 0);
// 3. 绑定地址信息
SOCKADDR_IN addrServer;
addrServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrServer.sin_family = AF_INET;
addrServer.sin_port = htons(6000); // 监听端口 6000
bind(sockServer, (SOCKADDR *)&addrServer, sizeof(addrServer));
// 4. 进入监听状态,等待连接
listen(sockServer, 5);
SOCKADDR_IN addrClient;
int len = sizeof(addrClient);
while(1)
{
// 5. 接受客户端连接
SOCKET sockConnection = accept(sockServer, (SOCKADDR *)&addrClient, &len);
// 6. 向客户端发送欢迎消息
char sendBuf[100];
sprintf(sendBuf, "Welcome %s", inet_ntoa(addrClient.sin_addr));
send(sockConnection, sendBuf, strlen(sendBuf)+1,0);
// 7. 接收客户端数据
char recvBuf[100];
recv(sockConnection, recvBuf, 100, 0);
printf("%s", recvBuf);
// 8. 关闭当前连接,准备接受下一个
closesocket(sockConnection);
}
}
第1步:环境初始化与版本检查
目的:确保系统已加载必要的网络库功能。
动作调用 WSAStartup 函数,指定所需的 Winsock 版本(此处为 MAKEWORD(1, 1))。
参数:&wsaData 用于接收加载的库实际版本信息。
注意:必须包含头文件 #include <WinSock2.h> 并在编译时链接 ws2_32.lib(使用 #pragma comment(lib, "ws2_32.lib"))。
第2步:绑定服务端口
目的:将套接字绑定到特定的 IP 和端口上。
动作配置 SOCKADDR_IN 结构体。
关键参数:sin_port 设为 htons(6000),表示服务器在本地 6000 端口提供服务;INADDR_ANY 表示接受来自任何网卡接口的连接。
第3步:循环处理连接
目的:处理多个客户端的数据交互。
动作:通过 accept 阻塞等待新连接;连接建立后,使用 send 和 recv 进行数据收发;最后通过 closesocket 释放该连接的资源。
TCP 客户端核心逻辑
客户端程序负责连接到指定的服务器地址和端口,发送请求数据并读取服务器的响应。以下是 Tcp Client 代码实现:
#include <WinSock2.h>
#include <stdio.h>
#pragma comment(lib, "ws2_32.lib")
int main()
{
// 1. 初始化 Winsock 库
WORD wVerisonRequested;
WSADATA wsaData;
int err;
wVerisonRequested = MAKEWORD(1, 1);
err = WSAStartup(wVerisonRequested, &wsaData);
if (err != 0)
{
return -1;
}
// 2. 创建客户端套接字
SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);
// 3. 连接服务器
SOCKADDR_IN addrServer;
addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); // 连接本地回环地址
addrServer.sin_family = AF_INET;
addrServer.sin_port = htons(6000); // 对应服务器端口
connect(sockClient, (SOCKADDR *)&addrServer, sizeof(addrServer));
// 4. 接收服务器发来的数据
char recvBuf[100];
recv(sockClient, recvBuf, 100, 0);
printf("%s", recvBuf);
// 5. 向服务器发送数据
char sendBuf[100] = "this is lisi\n";
send(sockClient, sendBuf, strlen(sendBuf)+1,0);
// 6. 关闭连接并清理资源
closesocket(sockClient);
WSACleanup();
}
第1步:建立连接通道
目的:发起与服务端的握手。
动作:填充目标服务器地址结构,重点在于 IP inet_addr("127.0.0.1") 和端口 htons(6000) 必须与服务器保持一致。
完成判断:connect 函数返回非错误值时表示链路已通。
第2步:数据交换与退出
目的:完成一次请求-响应交互。
动作先调用 recv 获取服务器欢迎语,再调用 send 发送用户标识字符串。
风险提醒:客户端结束后必须调用 WSACleanup() 以卸载 Winsock 动态链接库,否则可能导致后续其他应用的网络异常。
运行与排错指南
要成功测试上述代码,请按以下顺序操作:
- 编译:确保编译器支持 Win32 API,并已正确链接
ws2_32.lib库。 - 启动服务端:首先运行 Tcp Server 程序,观察控制台是否无报错输出(它处于
listen状态)。 - 启动客户端:在同一台机器上运行 Tcp Client 程序。
- 观察结果:服务端控制台应打印出 "Welcome 127.0.0.1" 后跟随客户端发送的内容;客户端控制台应打印 "Welcome 127.0.0.1" 并自动退出。
若出现连接失败或超时,请检查防火墙设置是否允许 6000 端口的入站流量,或确认服务端代码中绑定的 IP/Port 与客户端一致。
以上就是 C++ 基于 WinSock2 实现 TCP Socket 客户端和服务端的详细内容,更多关于 C++ 网络编程的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













