2012-11-03 77 views
1

我已经写了一个服务器 - 客户端程序,我要问:有没有在的recv()函数的32位和64位操作系统之间的行为有什么区别。的Recv()的行为32位和64位操作系统之间的差异

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

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

我已经使用打印语句,并发现它进入while循环一次,并接受所有的缓冲虽然在客户端部分,而进入循环3次预期和3串在3个不同时间发送。我无法找到一个合理的理由,为什么它在64位工作正常,而不是在32位工作,这就是为什么我问这个问题。

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

+0

您是否在32位和64位版本中使用相同的操作系统?它可能不一定是处理器体系结构的差异,但可能是系统调用的OS /驱动程序处理? –

+0

谢谢你的答案。没有我使用不同的操作系统...薄荷在第一个案件和Debian在第二个。但我不认为这是造成差异。造成这种差异的原因(边界不维持),是可能是在下面的答案中解释的那些。 – SpyrosR

回答

4

如果这是一个流插座,则没有固有消息边界,并有发送和接收的消息之间没有相关性。 recv()可能会返回消息的一部分,整个消息或多个消息;所有这一切都保证了字节的接收顺序与它们发送的顺序相同。

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

+0

是的,它是一个流套接字,我忘了说,在第一种情况下,我在同一台笔记本电脑上运行的程序,在第二种情况下,我使用两台不同的机器连接fine.Is这种差异的原因?字节是收到的顺序与他们发送的顺序完全相同。非常感谢您的支持。 – SpyrosR

+2

是的,在机器和同一台机器之间发送信息也可以有所作为。差异不是有意的,它们只是数据处理方式的副作用。使用流套接字时,您绝不能期望消息边界得以保持。 – Barmar

+0

好吧,我明白为什么会发生这种情况。再次感谢你! – SpyrosR

相关问题