利用C++ recv函数实现数据包的完整接收

   2024-10-01 6430
核心提示:在C++中使用recv函数接收数据包时,需要注意数据包可能会被分成多个部分发送,因此需要对数据进行缓存和拼接,直到接收到完整的

在C++中使用recv函数接收数据包时,需要注意数据包可能会被分成多个部分发送,因此需要对数据进行缓存和拼接,直到接收到完整的数据包为止。以下是一个示例代码,实现数据包的完整接收:

#include <iostream>#include <cstring>#include <sys/types.h>#include <sys/socket.h>#define BUFFER_SIZE 1024int main() {    int server_fd, new_socket;    struct sockaddr_in address;    int addrlen = sizeof(address);    char buffer[BUFFER_SIZE] = {0};    // 创建socket    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {        perror("socket failed");        return -1;    }    // 绑定地址和端口    address.sin_family = AF_INET;    address.sin_addr.s_addr = INADDR_ANY;    address.sin_port = htons(8888);    if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {        perror("bind failed");        return -1;    }    // 监听连接    if (listen(server_fd, 3) < 0) {        perror("listen failed");        return -1;    }    // 接受连接    if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {        perror("accept failed");        return -1;    }    // 接收数据包    std::string data;    int bytes_received;    do {        bytes_received = recv(new_socket, buffer, BUFFER_SIZE, 0);        if (bytes_received < 0) {            perror("recv failed");            return -1;        }        data.append(buffer, bytes_received);    } while (bytes_received > 0);    // 处理接收到的完整数据包    std::cout << "Received data: " << data << std::endl;    return 0;}

在上面的代码中,创建了一个服务器并监听连接,接收到新的连接后,使用recv函数接收数据包,直到接收到的字节数为0为止。接收到的数据会不断追加到一个字符串变量中,直到接收到完整的数据包。最后输出完整的接收到的数据包。

 
举报打赏
 
更多>同类物流大全
推荐图文
推荐物流大全
点击排行

网站首页  |  关于我们  |  联系方式网站留言    |  赣ICP备2021007278号