如何读取套接字消息

How to read my socket messages

本文关键字:套接字 消息 读取 何读取      更新时间:2023-10-16

我正在从c中的套接字读取可变字节消息,但是当任何消息中的某些字节为时存在问题。它分为两部分,只发送前一半。客户端也有接收问题。

请建议任何格式,我都可以使用。

我的一个解决方案是先发送消息的大小,然后再发送其余的消息。这将解决问题,但处理过程变得复杂。

我正在寻找其他更清洁的解决方案吗?

/**
    Send data to the connected host
 */
bool send_data(const char* data) {
    //Send some data
    if (sendto(sock, data, strlen(data), 0,
            (const struct sockaddr *) &server, length) < 0) {
        perror("Send failed ");
        return false;
    }
    std::cout << "Data sent: length=" << strlen(data) << " n";
    char str[INET_ADDRSTRLEN];
    inet_ntop(AF_INET, &(server.sin_addr), str, INET_ADDRSTRLEN);
    std::cerr << "server.sin_addr=" << str << std::endl;
    return true;
}
/**
    Receive data from the connected host
 */
void receive(char * buffer, size_t size) {
    //Receive a reply from the server
    if (recvfrom(sock, buffer, size, 0, (struct sockaddr *) &from, (socklen_t*) & length) < 0) {
        puts("recv failed");
    }
    char str[INET_ADDRSTRLEN];
    inet_ntop(AF_INET, &(from.sin_addr), str, INET_ADDRSTRLEN);
    std::cerr << "from.sin_addr=" << str << std::endl;
}

我发送的数据只是转换为char *的整数。有些整数很小,所以上面的字节大多是00000000。这就是我的问题。

我假设您可以访问服务器和客户端代码。

你说你知道你的消息的大小,所以你可以在发送它之前准备你的消息,寻找任何字符和替换替换它与一个唯一的字节序列,你可以识别在客户端,将其替换回原始字符。

如果您的问题是由直接将整数转换为字符数组并发送它们引起的,那么我建议将整数写入ostringstream(在c++标准库中可用),通过调用ostringstreams str()方法提取整数,然后通过套接字发送格式化的字符串。这将为您提供整数的字符表示,并应解决任何格式问题。