我在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ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ
我错过了什么?
答案 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);
}