2014-09-01 42 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