recv()何时返回?

recv()何时返回?,c,sockets,stream,swift,recv,C,Sockets,Stream,Swift,Recv,我用套接字制作了一个服务器和一个客户端。我的服务器是用c写的,运行在我的raspberry pi上,我的客户端是用Swift写的,运行在我的Mac/iPhone上 我没有得到的是当我的servers recv()函数执行我从客户端发送的内容时?如果我发送0-10个字节,在我关闭连接之前,它不会从recv()函数返回。但如果我发送100+字节,它会立即执行 我希望每次从客户端写入消息时,服务器都能从recv()返回 以下是我的服务器recv()函数: //Receive a message fro

我用套接字制作了一个服务器和一个客户端。我的服务器是用c写的,运行在我的raspberry pi上,我的客户端是用Swift写的,运行在我的Mac/iPhone上

我没有得到的是当我的servers 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))
}

除了我无法控制服务器何时执行我的消息之外,一切都正常。

服务器没有收到消息,因为客户端没有发送消息


您需要
fflush
客户端的输出流

服务器没有收到消息,因为客户端没有发送消息


您需要
fflush
客户端的输出流

默认情况下,
stdout
的输出是行缓冲的,因此在使用
printf
时,请确保末尾有换行符(
'\n'
)。如果消息本身不包含换行符,则:

printf("%s\n", client_message);
另请注意:在将
client_消息传递给
printf
之前,还要确保它正确地以null结尾,否则您可能会遇到未定义的行为(请参阅@JoachimPileborg的评论)。如果不能确保空终止,这也可以做到:

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

默认情况下,
stdout
的输出是行缓冲的,因此在使用
printf
时,请确保末尾有换行符(
'\n'
)。如果消息本身不包含换行符,则:

printf("%s\n", client_message);
另请注意:在将
client_消息传递给
printf
之前,还要确保它正确地以null结尾,否则您可能会遇到未定义的行为(请参阅@JoachimPileborg的评论)。如果不能确保空终止,这也可以做到:

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

我不知道Swift是否发送C代码所需的字符串终止符,因此您可能会在服务器中遇到错误。我也用C编写了客户端。从那里我得到了同样的行为。您是说\0结束字符吗?您确定缓冲数据的是
recv
而不是
printf
?尝试在
printf
格式字符串的末尾添加一个
'\n'
。是的,这是我提到的终止
'\0'
字符。如果客户端不发送,服务器需要添加它。哦,关于@sanderedycker的评论,您必须记住默认情况下,
stdout
的输出是行缓冲的。添加手动刷新输出缓冲区的换行符。我不知道Swift是否发送C代码所需的字符串终止符,因此您可能会在服务器中遇到错误。我也用C创建了客户端。从那里我得到了同样的行为。您是说\0结束字符吗?您确定缓冲数据的是
recv
而不是
printf
?尝试在
printf
格式字符串的末尾添加一个
'\n'
。是的,这是我提到的终止
'\0'
字符。如果客户端不发送,服务器需要添加它。哦,关于@sanderedycker的评论,您必须记住默认情况下,
stdout
的输出是行缓冲的。添加一个换行符,手动刷新输出缓冲区。我将换行符添加到printf中,现在可以使用了。你确定我的客户端没有发送消息吗?如果outputStream是行缓冲的,那么添加换行符将导致缓冲区刷新(隐式刷新)。我将换行符添加到printf中,它现在可以工作了。你确定我的客户端不发送消息吗?如果outputStream是行缓冲的,那么添加换行符将导致缓冲区刷新(隐式刷新)。