我遇到了一个有趣的C套接字问题。
我收到传入的字符串,并注意到我会随机收到前2~4个字符串的3个字符串。
例如,我收到以下传入字符串。
1~message~i love you\r\n
2~message~do you love me?\r\n
3~message~when are we going to meet again?\r\n
4~message~How about now?\r\n
5~message~Oh! I'm pregnant!\r\n
我添加了一个计数器来跟踪收到的消息数量,并注意到计数器有时不计算前3个字符串。例如
1~message~i love you\r\n
->Line 1 received
2~message~do you love me?\r\n
3~message~when are we going to meet again?\r\n
4~message~How about now?\r\n
->Line 2 received
5~message~Oh! I'm pregnant!\r\n
->Line 3 received
以下是我打印行号的代码
int lineNo = 1;
while ((recvBytes = recv(clntSockfd, buffer, sizeof(buffer), 0)) > 0) {
printf("%s", buffer);
memset(&buffer, 0, sizeof(buffer));
printf("Line %d received\n", lineNo++);
}
我不确定为什么会发生这种情况,因为当我用Java nio编码时,这个问题没有出现。
任何想法,伙计们?
答案 0 :(得分:8)
假设您正在使用TCP,则在您的案例中将recv()调用与“messages”(或“lines”)相关联是有缺陷的。从概念上讲,TCP是一个字节流。发送操作系统可以将多个send()调用分组为单个IP数据包,接收操作系统可以将多个传入数据包作为单个recv()调用进行自由报告(假设缓冲区足够大)。它甚至可以选择在recv调用之间拆分传入的数据包。
所以你真的需要在数据本身中放置一个消息结构,例如。通过扫描收到的数据中的换行符。
这在Java中没有发生,纯粹是运气。
答案 1 :(得分:1)
直到最后才开始阅读。 buffer
可以包含多行。
答案 2 :(得分:0)
您使用的连接类型是什么?
UDP大部分时间都不可靠。
在可靠性方面,TCP远优于UDP。