2014-09-01 68 views
1

我做了一個服務器和客戶端使用套接字。我的服務器是用c編寫的,運行在我的樹莓派上,我的客戶端用Swift編寫,並運行在我的Mac/iPhone上。recv()何時返回?

我不明白的是當我的服務器recv()函數執行我從客戶端發送的內容?如果我發送像0-10字節它不會從recv()函數返回關閉連接之前。但是如果我發送100+字節,它會立即執行。

我想我的服務器從recv()返回,每次我從我的客戶端寫入消息。

這裏是我的服務器的recv()函數:

//Receive a message from client 
while((read_size = recv(sock , client_message , 2000 , 0)) > 0) 
{ 
    printf("%s", client_message); 
} 

這裏是我的客戶編寫方法:

func SendMsg(msg:String) -> Int{ 
    return outputStream!.write(msg, maxLength: countElements(msg)) 
} 

一切正常旁邊我在服務器執行時的控制是不是我的消息。

+1

我不知道,如果斯威夫特發送由C代碼所需要的字符串結束,所以你可能有一個可能的情況下[ *未定義的行爲*](http://en.wikipedia.org/wiki/Undefined_behavior)在服務器。 – 2014-09-01 11:21:46

+0

我也用C做了客戶端。從那裏我得到了同樣的行爲。你在說什麼\ 0結束字符? – 2014-09-01 11:22:49

+6

你確定它是'recv'而不是'printf'來緩衝數據嗎?嘗試在'printf'格式字符串的末尾添加''\ n''。 – 2014-09-01 11:24:41

回答

6

輸出爲stdout默認爲行緩衝,因此使用printf時,請確保末尾有換行符('\n')。如果該消息本身沒有包含換行符,則:

printf("%s\n", client_message); 

補充說明:也確保client_message正確空終止它傳遞給printf之前,或者你可能會遇到不確定的行爲(REF 。@ JoachimPileborg的評論)。如果你不能確保空終止,這會做的伎倆太:

printf("%.*s\n", read_size, client_message); 
2

服務器沒有收到消息,因爲客戶端沒有發送它。

你需要fflush outputStream在客戶端!

+0

我在我的printf中添加了新行字符並且它現在可以工作了你確定我的客戶端不發送消息嗎 – 2014-09-01 11:37:06

+0

如果outputStream是行緩衝的,那麼添加一個換行符會導致緩衝區刷新(隱式刷新)。 – 2014-09-01 11:39:15