1

我已经编写了一个服务器-客户端程序,我想问一下:在 32 位和 64 位操作系统之间,recv() 函数的行为有什么不同。

我问这个是因为我在 64 位笔记本电脑上同时运行服务器和客户端,并且一切正常。我以这种方式调用 recv() :while((tmp = recv(client_sock,rec_msg,256,0))>0)并且正如预期的那样,例如,如果我有 3 个字符串要从客户端发送,在服务器部分它会输入 while 3 次并打印正确的结果。

当我在 32 位 Debian 机器上运行完全相同的程序时,似乎由于某种未知的原因,如果我从客户端发送 3 个字符串,它只进入服务器部分的 while 循环一次,并将 3 个字符串作为一个接收。

我使用了 print 语句,发现它一次进入 while 循环并接收所有缓冲区,尽管在客户端部分 while 循环按预期输入了 3 次,并且在 3 个不同的时间发送了 3 个字符串。我找不到为什么它在 64 位上工作正常而在 32 位上工作不正常的合乎逻辑的原因,这就是我问这个问题的原因。

提前感谢您的时间和帮助。

4

1 回答 1

4

如果这是一个流套接字,那么就没有固有的消息边界,并且发送和接收的消息之间没有关联。recv()可以返回部分消息、整个消息或多条消息;唯一可以保证的是字节的接收顺序与它们发送的顺序相同。

您看到的差异可能只是由于两台机器之间的速度差异。32 位机器速度较慢,因此在检查网络上可用数据的时间里,所有 3 个数据包都已到达。但是速度更快的 64 位机器会在第二个数据包到达之前处理从第一个数据包接收到的数据。

于 2012-11-03T02:23:46.770 回答