Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 32位和64位操作系统之间的Recv()行为差异_Sockets_Recv - Fatal编程技术网

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

Sockets 32位和64位操作系统之间的Recv()行为差异,sockets,recv,Sockets,Recv,我已经编写了一个单服务器客户端程序,我想问:32位和64位操作系统之间recv()函数的行为有什么不同吗 我这样问是因为我在64位笔记本电脑上运行服务器和客户端,一切正常。我这样调用recv():while((tmp=recv(client_sock,rec_msg,256,0))>0),如果我有3个字符串要从客户端发送,它会在服务器部分输入while 3次并打印正确的结果 当我在32位Debian机器上运行完全相同的程序时,似乎出于某种未知的原因,如果我发送3个字符串,例如从客户机发送,它只会

我已经编写了一个单服务器客户端程序,我想问: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位机器在第二个数据包到达之前处理从第一个数据包接收到的数据。

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


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

32位和64位版本是否使用相同的操作系统?这可能不一定是处理器架构上的差异,但可能是系统调用的操作系统/驱动程序处理?谢谢你的回答。不,我在第一种情况下使用不同的操作系统…Mint,在第二种情况下使用Debian。但我不认为这是造成差异的原因。造成这种差异的原因(没有保持边界),下面的答案可能解释了这些。您是否在32位和64位版本中使用相同的操作系统?这可能不一定是处理器架构上的差异,但可能是系统调用的操作系统/驱动程序处理?谢谢你的回答。不,我在第一种情况下使用不同的操作系统…Mint,在第二种情况下使用Debian。但我不认为这是造成差异的原因。造成这种差异的原因(没有保持边界),答案中可能解释了这些。是的,这是一个流套接字,我忘了说,在第一种情况下,我在同一台笔记本电脑上运行程序,在第二种情况下,我使用两台连接良好的不同机器。这是造成这种差异的原因吗?字节的接收顺序与发送顺序完全相同。谢谢非常感谢您的回复。是的,在机器之间发送和发送到同一台机器也会有所不同。这些差异不是故意的,它们只是数据处理方式的副作用。当使用流套接字时,您决不能期望消息边界得到维护。好的,我理解为什么会发生这种情况。再次感谢您!一般来说,您应该始终测试recv/read api的返回值,并在循环中不断调用,直到收到预期的字节数。一次呼叫甚至可能返回1,2,10个或最多10个字节在一次呼叫中发送。是的,这是一个流套接字,我忘了说,在第一种情况下,我在同一台笔记本电脑上运行程序,在第二种情况下,我使用两台连接良好的不同机器。这是造成这种差异的原因吗?字节的接收顺序与它们的接收顺序完全相同发送。非常感谢您的回复。是的,在机器之间发送和发送到同一台机器也会有所不同。这些差异不是故意的,它们只是数据处理方式的副作用。当使用流套接字时,您决不能期望消息边界得到维护。好的,我理解为什么会发生这种情况。再次感谢您!一般来说,您应该始终测试recv/read api的返回值,并在循环中不断调用,直到收到预期的字节数。单个调用甚至可能返回1、2、10或最多一个调用中发送的总字节数。