首页 文章

recv()何时返回?

提问于
浏览
1

我使用套接字创建了一个服务器和一个客户端 . 我的服务器是用c语言编写的,运行在我的覆盆子pi上,我的客户端用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))
}

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

2 回答

  • 2

    输出到 stdout 默认为行缓冲,因此在使用 printf 时,请确保最后有换行符( '\n' ) . 如果邮件本身尚未包含换行符,则:

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

    作为旁注:还要确保 client_message 在将其传递给 printf 之前正确地为空终止,否则您可能会遇到未定义的行为(参考@JoachimPileborg 's comment). If you can'确保无效终止,这也可以解决问题:

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

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

    你需要 fflush 客户端的outputStream!

相关问题