首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

当使用Winsock读取所有信息时,结束"recv()"循环

当使用Winsock读取所有信息时,结束"recv()"循环的关键是检测到连接已经关闭或者接收到的数据长度为0。以下是一个简单的示例代码:

代码语言:c++
复制
#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()函数读取数据,并不是一个完整的网络应用程序。在实际应用中,我们需要考虑更多的因素,例如错误处理、多线程等。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • TCP/IP具体解释–TCP/UDP优化设置总结& MTU的相关介绍「建议收藏」

    当中以太网(Ethernet)的数据帧在链路层    IP包在网络层    TCP或UDP包在传输层    TCP或UDP中的数据(Data)在应用层    它们的关系是 数据帧{IP包{TCP或UDP包{Data}}}    ——————————————————————————— 在应用程序中我们用到的Data的长度最大是多少,直接取决于底层的限制。    我们从下到上分析一下:    1.在链路层,由以太网的物理特性决定了数据帧的长度为(46+18)-(1500+18),当中的18是数据帧的头和尾,也就是说数据帧的内容最大为1500(不包含帧头和帧尾)。即MTU(Maximum Transmission Unit)为1500;   2.在网络层。由于IP包的首部要占用20字节,所以这的MTU为1500-20=1480;  3.在传输层,对于UDP包的首部要占用8字节。所以这的MTU为1480-8=1472。    所以,在应用层,你的Data最大长度为1472。

    01
    领券