recv()何时返回?
我用套接字制作了一个服务器和一个客户端。我的服务器是用c写的,运行在我的raspberry pi上,我的客户端是用Swift写的,运行在我的Mac/iPhone上 我没有得到的是当我的servers recv()函数执行我从客户端发送的内容时?如果我发送0-10个字节,在我关闭连接之前,它不会从recv()函数返回。但如果我发送100+字节,它会立即执行 我希望每次从客户端写入消息时,服务器都能从recv()返回 以下是我的服务器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
//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是行缓冲的,那么添加换行符将导致缓冲区刷新(隐式刷新)。