我正在编写TCP服务器客户端。我使用单独的send
系统调用单独发送三个字符串。
但接收端我只得到单个字符串,这是我发送的第一个字符串。剩下的两串错过了。
下面给出了我的服务器客户端程序部分。
client.c
char *info = "infolog";
char *size = "filesize";
char *end = "fileend";
send(client, info, strlen(info)+1, 0);
send(client, size, strlen(size)+1, 0);
send(client, end, strlen(end)+1, 0);
server.c
while ((read_size = recv(client, msg, sizeof(msg), 0))) {
printf("Data: %s\n", msg);
memset(msg, 0, sizeof(msg));
}
实际输出:
Data: infolog
预期输出
Data: infolog
Data: filesize
Data: fileend
感谢。
答案 0 :(得分:3)
尝试打印read_size
。您可能已收到所有消息。
由于Nagle's Algorithm,发件人可能会批量处理您的三个send()
来电并向服务器发送一个数据包。虽然您可以禁用Nagle的算法,但在这种情况下我认为这不是一个好主意。您的服务器需要能够处理部分数据的接收,并处理接收的数据超出预期。
您可能希望考虑为邮件使用上层协议,例如Google Protocol Buffers。看看techniques页面,它们描述了它们如何做到这一点:构建协议缓冲区,并在写入缓冲区之前将其长度写入流。这样,接收方可以读取长度,然后确定在有完整消息之前需要读取多少字节。
答案 1 :(得分:3)