通过套接字接收的数据不能用于C++
Data received via sockets can't be used C++
所以我得到了套接字通信,并且我得到了正确的消息。。。然而,当我试图从接收缓冲区中提取它时。。。它不起作用。我的代码看起来像这样:
void CClientSocket::OnReceive(int nErrorCode)
{
char buff[1000];
int ibuf = Receive(buff,sizeof(buff));
buff[sizeof(buff)-1] =' ';
CSocket::OnReceive(nErrorCode);
}
当我在调试中运行时,buff的值包含正确的消息。。。以及填充阵列的未使用部分的一堆随机字符。然而,我不能使用这些数据。。。如果我尝试转换为CString,甚至将字符传输到不同的数组。。。什么都不管用。我很困惑,真的不知道该怎么办。
如果你需要更多信息,或者我在任何方面都不清楚,请告诉我。
EDIT:我尝试提取数据的一些代码
CString string;
string = CString(buff);
和
char *msg;
msg = new char[ibuf]
for(int i = 0; i < ibuf; i++){
msg[i] = (char)buff[i];
}
编辑:一些澄清当我说"什么都不起作用"时,我的意思是当我试图转换它时,结果是和空的CString或空的char等…没有错误。
int ibuf = Receive(buff,sizeof(buff));
buff[sizeof(buff)-1] =' ';
将零字节放在buff[ibuf]
,而不是第二行。但在此之前,添加一个错误检查(确保ibuf > 0
,如果不是,则将其视为连接断开。)此外,如果你这样做,你应该使用Receive(buff, sizeof(buff)-1);
(注意-1
-这说明了终止字符-感谢@Altnitak指出这一点。)
另一方面。。。我还认为,这不是处理套接字代码的方法。字符串不是通过网络以原子方式发送的。他们将被分开。如果您控制协议,我建议您离开以字符串为中心的宇宙视图,并构建您的网络通信,使消息以一个整数(uint16_t
或uint32_t
,并确保调用htons
/htonl
等)开始,指示随后的有效载荷的长度。然后继续缓冲传入的字节,并在有足够的字节满足指定长度时对其进行处理。
如果你不控制协议,找到一个方便的标记,你可以用它来决定何时处理内容,并缓冲字节,直到你到达它
相关文章:
- 使用 Broadcast 发出的从节点服务器发送的数据不能被 C++ 套接字 IO 客户端读取
- 为什么我不能从结构将数据输入到字符数组中?
- 为什么静态数据成员不能在c++11中的类中初始化
- 返回实例变量的c++方法可以访问变量中的数据,但不能更改它,但在编译时不会生成错误
- 为什么不能使用"( )"为类的非静态数据成员提供默认值?
- 为什么我的节点临时节点不能显示正确的数据?
- 什么形式上保证了非原子变量不能看到凭空出现的值,并像理论上原子一样创造数据竞赛?
- 为什么Ubuntu c++中的eclipse不能打印出数据
- C++为什么 int 变量可以声明为类的私有数据成员,但不能声明为字符串变量
- 蓝牙可以接收数据,但不能传输数据(用C++进行套接字编程以与Matlab通信)
- 为什么初始化捕获可变 lambda 不能具有可变数据成员?
- 为什么我不能从输入文件中检索简单数据并使用C++将其写入输出文件?
- 提升ASIO TCP,为什么我不能在服务器端只有一个数据套接字可以打开和关闭
- C/C++嵌入python模块PIL,python函数想返回所有像素数据,但我为什么不能?
- 为什么类数据成员不能通过直接初始化语法初始化?
- 不能将Const数据类型分配到非Const数据类中
- 为什么我不能在复制构造函数中更改实例的私有数据,如果它是 const 的?
- 为什么我不能从此数据集中删除虚假的 0?
- 数据成员'vec'不能是成员模板
- 通过套接字接收的数据不能用于C++