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

Pol*_*uin 2 c java 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
Run Code Online (Sandbox Code Playgroud)

我添加了一个计数器来跟踪收到的消息数量,并注意到计数器有时不计算前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
Run Code Online (Sandbox Code Playgroud)

以下是我打印行号的代码

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++);
}
Run Code Online (Sandbox Code Playgroud)

我不确定为什么会发生这种情况,因为当我用Java nio编码时,这个问题没有出现.

任何想法,伙计们?

Mar*_*wis 8

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

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

这在Java中没有发生是纯粹的运气.