2012-11-03 118 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

相關問題