Winsock通过Recv()接收随机字母

时间:2019-10-18 19:17:05

标签: c++ winsock

我正在尝试进行Winsock聊天。我想发送位于2个“标签”之间的数据包。有点像“ ^^^ TAG ^^^ 数据包数据 ^^^ TAG ^^^^”

问题是,我正在使用的客户端应用程序,包括我编写的自己的客户端应用程序,要么发送错误消息,要么服务器应用程序接收到错误数据

这是我的意思:

Using Hercules TCP Client

Using my own Client

我知道为什么将其拆分,这就是我的Tag想法的目的,但是,如果您阅读了我发送的内容以及得到的内容,将会看到添加和替换的字母。在某个时候,我什至得到了我发送的单词,后面跟着“随机的unicode字符,但我无法再次将其截取到屏幕截图。

由于我离开互联网的大多数TCP客户端均无法正常工作,我认为问题出在我如何接收数据包,而不是我和其他程序如何发送数据包

我的代码:

这是我的代码的重写后的简单版本

const m = require('mithril');

//Use a closure to manage internal state of component
const play = initialVnode => {

  const { 
    timestamp
  } = initialVnode.attrs;

  const start = timestamp;

  return {

    view: vnode => m('ul',[
        m('li',`Start: ${start}`),
        m('li',`Current timestamp: ${vnode.attrs.timestamp}`),      
    ])
  }
};

let reqID;

const step = timestamp => {

  if( timestamp ){ //Start animating when timestamp is defined 

      m.render(document.body, m(play,{
        timestamp,
      }));
  }

  reqID = requestAnimationFrame(step);

  if( reqID === 60 ){ //Add condition to stop animating
     cancelAnimationFrame(reqID);
  }

};

step();

1 个答案:

答案 0 :(得分:4)

if (0 < recv(reinterpret_cast<server_info*>(pi->server_info_pointer)->clients.at(i).sock, lpBuffer, sizeof(lpBuffer), 0))

您忽略了recv的返回值,因此您的代码不知道收到了多少字节。另外,请参见下面的sizeof(lpBuffer)此处错误原因。

memset(lpBuffer, 0, sizeof(lpBuffer));

由于lpBufferchar *,因此将sizeof(char *)字节清零,这是不对的。仅在需要 type 大小时使用sizeof。另外,为什么要对已经使用且永远不会再使用的缓冲区归零?

std::string lpNewBuffer = lpBuffer;

您应该已经使用recv的返回值来知道lpNewBuffer应该有多少个字节。

如果不是字符串,请勿将其视为字符串。存储recv的返回值,以便您知道收到了多少字节。