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

时间:2014-12-17 14:06:05

标签: 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 << ";";
}

我发送消息&#34;你好&#34;从客户端到服务器。但是缓冲区实际上是这样的:

HelloÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ

我错过了什么?

4 个答案:

答案 0 :(得分:7)

由于recv可能没有收到您告诉它的字节数,因此通常使用一个函数 像这样接收指定的字节数。修改自here

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
} 

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

答案 1 :(得分:3)

结果告诉您收到了多少字节。 recv没有添加终结符,因为通常网络数据是二进制数据,可能无法用作C风格的字符串。

如果您知道邮件不包含终止字符,您可以自己添加终结符:

buffer[result] = 0;  // make sure the buffer is large enough

或从中创建一个字符串(或向量,或其他):

std::string message_str(message, result);

请注意,您收到的内容可能不是单个&#34;消息&#34;,特别是如果您使用像TCP这样的流协议。它可能包含多条消息,或者只包含一条消息。

答案 2 :(得分:1)

memset(&receive [0],0,sizeof(receive));
清除缓冲区

答案 3 :(得分:0)

您没有初始化缓冲区

char buffer[200] = {0};

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

    if (result > 0)
        cout << "\n\tMessage from client: \n\n\t" << message << ";";
    memset(buffer, 0, 200);
}