在套接字中的send / recv之间进行同步

时间:2010-09-07 04:27:59

标签: c++ c

我有一台服务器将数据记录作为不同长度的字符串发送(例如,79,80,81,82)

我希望能够一次只收到一条记录。我用(r)分隔记录,但因为我不知道我必须收到多少字节,它有时合并记录并使我很难过程

4 个答案:

答案 0 :(得分:4)

我有两个想法:

  1. 使用XML作为协议。通过这种方式,您可以准确了解每条消息的结束时间。
  2. 在每个“数据包”的标题中发送数据包大小,这样你就知道从这个特定数据包的套接字中读取了多少。
  3. 编辑: 看看(2)

    的这个虚拟代码
    int buffer_size;
    char* buffer;
    
    read( socket, &buffer_size, sizeof(buffer_size)); 
    buffer = (char*) malloc(packet_size);
    read( socket, buffer, buffer_size );
    // do something
    free( buffer) ; 
    

    编辑: 我建议在这里查看注释,因为他们注意到一个简单的“read()”可能没有准备好,你需要保持“read()”,直到你得到正确的缓冲区大小。

    另外 - 您可能不需要阅读尺寸。基本上,您需要查找XML的结束顶级标记。这可以通过解析整个XML来完成,或者解析从流中获得的XML,直到你有0个节点“打开”。

答案 1 :(得分:0)

您是以流的形式发送数据吗?

您可以将其作为一种更易于解析和检索数据的结构发送。

struct Message
{
  int dataSize;
  char data[256];
};

答案 2 :(得分:0)

您应该使用空字节分隔。向我们展示您的代码,我们可以帮助您。

答案 3 :(得分:0)

流套接字本身不支持“记录”的概念 - 它们提供的抽象是连续流的抽象。

您必须在它们之上实现一个图层以提供“记录”。这听起来像你已经在那里,与记录结束分隔符。完成它的伪代码是:

create empty buffer;
forever {
    recv data and append to buffer;

    while (buffer contains end-of-record marker) {
        remove first record from buffer and process it;
        move remaining data to beginning of buffer;
    }
}