如何在winsock编程中从recv()获取确切的消息?

use*_*012 3 c++ winsock

我正在使用C++中的Winsock开发一个服务器客户端应用程序并遇到问题.

为了通过服务器从客户端获取消息,我使用下面的代码.

int result;
char buffer[200];

while (true)
{
    result = recv(client, buffer, 200, NULL);

    if (result > 0)
        cout << "\n\tMessage from client: \n\n\t" << message << ";";
}
Run Code Online (Sandbox Code Playgroud)

我从客户端向服务器发送消息"Hello".但是缓冲区实际上是这样的:

HelloÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

gio*_*gim 7

由于recv可能没有收到您告诉它的字节数,因此通常使用这样的函数来接收指定的字节数.从这里修改

int receiveall(int s, char *buf, int *len)
{
    int total = 0;        // how many bytes we've received
    int bytesleft = *len; // how many we have left to receive
    int n = -1;

    while(total < *len) {
        n = recv(s, buf+total, bytesleft, 0);
        if (n <= 0) { break; }
        total += n;
        bytesleft -= n;
    }

    *len = total; // return number actually received here

    return (n<=0)?-1:0; // return -1 on failure, 0 on success
} 
Run Code Online (Sandbox Code Playgroud)

如果您收到非空终止的字符串,则由null终止字符串.

  • @ user3530012:是的,但总的来说你应该记住,正如我所说的那样`recv`可能没有收到你告诉它的所有数据(阅读我给出的链接了解更多细节) (2认同)