我编写了一个服务器 - 客户端程序,我想问一下:32位和64位操作系统之间recv()函数的行为是否存在差异。
我问这个是因为我在64位笔记本电脑上运行服务器和客户端,一切正常。我用这种方式调用recv():while((tmp = recv(client_sock,rec_msg,256,0))>0)
并且如果例如我有3个字符串要从客户端发送,在服务器部分它输入3次并打印出正确的结果。
当我在32位Debian机器上运行完全相同的程序时,似乎由于某种未知的原因,如果我从客户端发送3个字符串,它只进入服务器部分的while循环一次并接收3个字符串作为一个
我已经使用了print语句并发现它进入while循环一次并接收所有缓冲区,尽管在客户端部分中while循环输入3次,并且3个字符串在3个不同时间发送。我找不到合理的原因,为什么它在64位工作正常而不能在32位工作,这就是我问这个问题的原因。
提前感谢您的时间和帮助。
答案 0 :(得分:4)
如果这是一个流套接字,则没有固有的消息边界,并且发送和接收的消息之间没有相关性。 recv()
可能会返回部分消息,整个消息或多条消息;所有保证的是,字节的接收顺序与它们的发送顺序相同。
您看到的差异可能仅仅是由于两台机器之间的速度差异。 32位计算机速度较慢,因此在检查网络上可用数据所需的时间内,所有3个数据包都已到达。但是速度更快的64位机器会在第二个数据包到达之前处理第一个数据包的接收数据。