我正在尝试进行Winsock聊天。我想发送位于2个“标签”之间的数据包。有点像“ ^^^ TAG ^^^ 数据包数据 ^^^ TAG ^^^^”
问题是,我正在使用的客户端应用程序,包括我编写的自己的客户端应用程序,要么发送错误消息,要么服务器应用程序接收到错误数据
这是我的意思:
我知道为什么将其拆分,这就是我的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();
答案 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));
由于lpBuffer
是char *
,因此将sizeof(char *)
字节清零,这是不对的。仅在需要 type 大小时使用sizeof
。另外,为什么要对已经使用且永远不会再使用的缓冲区归零?
std::string lpNewBuffer = lpBuffer;
您应该已经使用recv
的返回值来知道lpNewBuffer
应该有多少个字节。
如果不是字符串,请勿将其视为字符串。存储recv
的返回值,以便您知道收到了多少字节。