【问题标题】:How to read my socket messages如何阅读我的套接字消息
【发布时间】:2016-11-10 10:27:29
【问题描述】:

我正在从 C 中的套接字读取可变字节消息。但是当任何消息中的某个字节为 \0 时,就会出现问题。它分为两部分,只发送前半部分。客户端也有接收问题。

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

一个解决方案,我有是先发送消息的大小,然后发送消息的其余部分。这样可以解决问题,但处理变得复杂。

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

/**
    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。因此我的问题。

【问题讨论】:

  • 你发送的数据是文本还是二进制?如果您发送二进制数据,则不能使用文本函数(例如 strlen)。如果没有看到任何代码,最好是Minimal, Complete, and Verifiable Example
  • “分成两部分,只发送前半部分”。为什么你不认为那是因为你的代码不正确?因为如果你有正确的代码,你当然可以发送和接收带有\0 的消息。但是看不到代码就无法指出问题所在。
  • strlen(data) 是你的问题。正如已经指出的那样,如果您的数据是二进制的(如果您想在其中包含\0s),则不能使用任何字符串函数。一种可能的解决方法是让send_data 函数采用长度参数。
  • "我发送的数据只是转换为 char * 的整数"。该更新只是确认您的数据非常二进制而不是文本。您不得在其上使用字符串函数。而且我看不出先发送尺寸有什么复杂之处。这是一种非常标准的操作方式。
  • 我认为先发送尺寸会很简单。

标签: c++ algorithm sockets sendmessage


【解决方案1】:

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

您说过您知道消息的大小,因此您可以在发送之前准备好消息,查找任何\0 字符并将其替换为您可以识别的唯一字节序列客户端,将其替换为原始字符。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-28
      • 2011-02-27
      • 1970-01-01
      • 2016-08-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-16
      • 2020-05-30
      相关资源
      最近更新 更多