【问题标题】:Sendto() socket method sends junk on short stringsSendto() 套接字方法在短字符串上发送垃圾
【发布时间】: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()) 提供了潜在的格式字符串攻击,请改用strncpysprintf(temp.Buffer,"%s",c.c_str())
  • 我用strcpy试过了,还是一样的错误。我没有用零值启动 buf,但是对于更长的字符串会有什么不同?

标签: c++ sockets


【解决方案1】:

您没有传输结尾的 '\0' 字符。您的协议是否指定了一个以 nul 结尾的字符串?如果是这样,请更改您的客户:

sendto( ..., temp.len+1, ...);

如果你的协议规定你不发送 nul 终止,那么修改你的服务器:

fromlen = sizeof sa_in;
received = recvfrom(s, buf, 2048, 0, (struct sockaddr*)&sa_in, &fromlen);
if(received >= 0)
    buf[received] = 0;

如果您的协议未指定,则现在停止编码并完成编写您的协议规范。

【讨论】:

    猜你喜欢
    • 2021-12-13
    • 1970-01-01
    • 2011-12-26
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多