我有一台服务器将数据记录作为不同长度的字符串发送(例如,79,80,81,82)
我希望能够一次只收到一条记录。我用(r)分隔记录,但因为我不知道我必须收到多少字节,它有时合并记录并使我很难过程
答案 0 :(得分:4)
我有两个想法:
编辑: 看看(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;
}
}