sockets - Recv()32位和64位操作系统之间的行为差​​异

标签 sockets recv

我已经编写了一个服务器-客户端程序,我想问一问: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位上正常工作,这就是为什么我问这个问题。

在此先感谢您的时间和帮助。

最佳答案

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

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

关于sockets - Recv()32位和64位操作系统之间的行为差​​异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13205352/

相关文章:

php - ZMQ订阅者在长时间间隔后没有收到来自远程服务器的消息

调用 recv() block 输入

c++ - 套接字和多线程

java - java的int序列化数组

Python;无法通过 select 控制死套接字

c - 没有数据发送时如何跳过recv()函数

java - com.mysql.jdbc.exceptions.jdbc4.CommunicationsException : Communications link failure Software caused connection abort: recv failed

c - Recv 调用获取空数据

c - 管理通信协议(protocol)本地套接字c

Appcelerator Titanium 中使用 SSL 的套接字