为什么我没有得到服务器的完整响应?

时间:2012-02-13 14:53:50

标签: sockets winsock

我想知道,为什么我的服务器(Win)没有完全响应以在客户端显示它(* nix)/

以下是代码:

Server ( Win ) : http://pastebin.com/CC1EHj0N<br />
Client ( *nix ) : http://pastebin.com/bFiLjMHh

来自客户端的请求(“来自Gentoo的Hello!”)我的服务器运行良好,但发送给客户端的响应在客户端没有呈现为满。

如你所见,我用过:

char response[]

然后在send方法中使用sizeof()调整大小。

在调试器中,我得到的结果很好,必须发送所有sizeof字节。

但是在客户端,我不是所有的字符串:(

为什么?

1 个答案:

答案 0 :(得分:1)

您的代码存在(至少)2个问题:

  • 在您的客户端中,您的缓冲区小于服务器发送的消息。因此,一次性收到整个邮件本来就不可能

  • 您只收到一次。没有什么能阻止TCP逐个处理字节。 TCP是面向流的,即使你提供足够的空间(你不是)

扩展第一点:

  • 您从服务器发送此消息

    char response[] = "Hello from Windows 7 Home Basic!\r\n";`
    result = send(sock_cli, response, sizeof(response), 0);
    
  • 这是你的接收缓冲区:

    char mess[] = "Hello from Gentoo!\r\n";
    char buffer[sizeof(mess)];
    /* ... */
    
    recv(sock, buffer, sizeof(mess), 0);
    

对于初学者,您可以确保客户端在缓冲区中尝试recv,该缓冲区至少与服务器发送的最大消息一样大。但真正的解决方案是在循环中recv