【发布时间】:2012-02-20 23:11:10
【问题描述】:
我有服务器和客户端通过 Windows 套接字发送/接收字符串。
客户端代码(发送者):
string c = "Haha";
sprintf(temp.Buffer, c.c_str());
temp.len = c.size();
int sent = 0;
if ((sent = sendto(s, temp.Buffer, temp.len + 1, 0, (SOCKADDR*)&sa_in, sizeof(sa_in))) == SOCKET_ERROR) {
cout << "Send request method failed\n";
}
服务器代码(接收方):
if (!(outfds = select (1 , &readfds, NULL, NULL, NULL))) {//timed out
cout << "timed out";
}
if (outfds == 1)
{
fromlen = sizeof sa_in;
received = recvfrom(s, buf, 2048, 0, (struct sockaddr*)&sa_in, &fromlen);
}
在服务器中,我注意到如果我从客户端发送的字符串小于字节数(如 0-8~),则“buf”变量的末尾包含垃圾。例如,我将发送字符串“ahah”,服务器将收到类似于“ahah0`”的字符串。如果我发送“Hello World”,它会正确接收。客户端和服务器中的字符缓冲区的大小都是 2048。
我找到的解决方案是在 sendto() 方法中将长度添加 +1。如果我发送的东西大于允许的最大尺寸,我不希望这会在以后咬我。
有谁知道这是从哪里来的,你有更好的解决方案吗?
编辑:发送和接收的字节数始终相同。
谢谢
【问题讨论】:
-
sprintf(temp.Buffer, c.c_str());?那有什么作用?你确定你说的不是strcpy()? -
+1还将发送 C 字符串的'\0终止符。您是否在接收器中使用零值启动了buf?而sprintf(temp.Buffer,c.c_str())提供了潜在的格式字符串攻击,请改用strncpy或sprintf(temp.Buffer,"%s",c.c_str())。 -
我用strcpy试过了,还是一样的错误。我没有用零值启动 buf,但是对于更长的字符串会有什么不同?