当使用Winsock读取所有信息时,结束"recv()"循环的关键是检测到连接已经关闭或者接收到的数据长度为0。以下是一个简单的示例代码:
#include <winsock2.h>
#include<iostream>
#include<vector>
int main()
{
WSADATA wsa;
SOCKET s;
struct sockaddr_in server, client;
char buffer[1024];
int client_len, recv_len;
// 初始化 Winsock
WSAStartup(MAKEWORD(2, 2), &wsa);
// 创建套接字
s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
// 配置服务器地址
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons(8888);
// 绑定套接字
bind(s, (struct sockaddr *)&server, sizeof(server));
// 监听套接字
listen(s, 1);
// 接受客户端连接
client_len = sizeof(client);
SOCKET client_s = accept(s, (struct sockaddr *)&client, &client_len);
// 读取数据
std::vector<char> data;
while ((recv_len = recv(client_s, buffer, 1024, 0)) > 0)
{
data.insert(data.end(), buffer, buffer + recv_len);
}
// 关闭套接字
closesocket(client_s);
closesocket(s);
// 处理数据
// ...
// 清理 Winsock
WSACleanup();
return 0;
}
在这个示例中,我们使用recv()
函数读取数据,并将接收到的数据存储在std::vector<char>
中。当recv()
函数返回0时,表示连接已经关闭,我们可以结束循环并处理接收到的数据。
需要注意的是,这个示例仅用于演示如何使用recv()
函数读取数据,并不是一个完整的网络应用程序。在实际应用中,我们需要考虑更多的因素,例如错误处理、多线程等。
领取专属 10元无门槛券
手把手带您无忧上云