C套接字 - 一次随机接收多个字符串

时间:2010-12-11 09:19:53

标签: java c sockets nio

我遇到了一个有趣的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编码时,这个问题没有出现。

任何想法,伙计们?

3 个答案:

答案 0 :(得分:8)

假设您正在使用TCP,则在您的案例中将recv()调用与“messages”(或“lines”)相关联是有缺陷的。从概念上讲,TCP是一个字节流。发送操作系统可以将多个send()调用分组为单个IP数据包,接收操作系统可以将多个传入数据包作为单个recv()调用进行自由报告(假设缓冲区足够大)。它甚至可以选择在recv调用之间拆分传入的数据包。

所以你真的需要在数据本身中放置一个消息结构,例如。通过扫描收到的数据中的换行符。

这在Java中没有发生,纯粹是运气。

答案 1 :(得分:1)

直到最后才开始阅读。 buffer可以包含多行

答案 2 :(得分:0)

您使用的连接类型是什么?

UDP大部分时间都不可靠。

在可靠性方面,TCP远优于UDP。