【发布时间】:2014-10-25 14:42:03
【问题描述】:
我已经使用套接字创建了一个服务器和一个客户端。我的服务器是用 c 编写的,运行在我的树莓派上,我的客户端是用 Swift 编写的,运行在我的 Mac/iPhone 上。
当我的服务器 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))
}
除了我无法控制服务器何时执行我的消息之外,一切正常。
【问题讨论】:
-
我不知道 Swift 是否发送了 C 代码需要的字符串终止符,所以你可能在服务器中有undefined behavior 的情况。
-
我也用 C 语言制作了客户端。从那里我得到了同样的行为。你在说 \0 结束字符吗?
-
您确定是
recv而不是printf缓冲数据吗?尝试在printf格式字符串的末尾添加'\n'。 -
是的,这就是我所说的终止
'\0'字符。如果客户端不发送,服务器需要添加。 -
哦,关于@SanderDeDycker 的评论,您必须记住默认情况下输出到
stdout是行缓冲。添加一个手动刷新输出缓冲区的换行符。
标签: c sockets stream swift recv