如何正确读取套接字消息(C++)
How to properly read from a socket message (C++)
我正在使用以下服务器代码:
[...]
while(1){
bzero(buffer,256);
n = read(newsockfd,buffer,255);
if (n < 0) error("ERROR reading from socket");
cout << "Message " << buffer << n << endl;
}
[...]
在客户端,我有(这是Java):
out.writeUTF("MOVE");
这条线重复了好几次。但是,当我这样做时,我得到的输出是:
Message 6
所以n是正确的,但是缓冲区是空的。
我也试过:
out.writeBytes("MOVE");
有时我会得到这个:
Message MOVE4
但有时我会得到这个:
Message M1
Message O1
Message V1
Message E1
那么,我能做什么呢?非常感谢。
根据POSIX读取函数的文档:
如果filtes引用了一个套接字,那么read()应等效于recv(),不设置任何标志。
recv的文件显示以下
对于基于流的套接字,如SOCK_stream,应忽略消息边界。在这种情况下,数据一旦可用,应立即返回给用户,不得丢弃任何数据。
因此,您应该准备好接收不完整的数据(在一次调用读取之后)或使用基于消息的套接字。处理不完整数据的可能方法是传递消息大小或使用特殊值(如NULChar)来标记消息结束。
第一个示例将写入字符串的长度写为实际字符串前面的16位数字。字符串短于256个字符,因此第一个字节为0x00。您需要调整在服务器端读取消息的方式。有关更多信息,请参阅此。
在第二个示例中,您的问题是不能保证在一个缓冲区中接收所有4个字符。在我看来,最好用一个空字节和缓冲区来完成发送的字符串,直到收到这个字节。
相关文章:
- boost::进程间消息队列引发错误
- 在线编译器中的分段C++没有打印消息
- C++错误消息*成员参考.**初学者*
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 如何通过参数抛出错误消息
- 从服务器传输到客户端的消息不会出现
- ROS2 动态消息模板
- C++秘密消息学校作业
- glad 导致 glfwSwapBuffers 返回错误消息
- C++入门 5 版:类消息和文件夹
- FindPackageHandleStandardArgs.cmake:137 的 CMake 错误(消息):找不到 Boost (缺少:正则表达式)(找到合适的版本"1.72.0",
- 如何处理从一个对象传递到另一个在C++中具有公共抽象类的对象的消息
- 如何接受 [ENTER] 键作为无效输入并发送错误消息
- 由于无效的 ValidateRgn() 子窗口不会收到WM_PAINT消息
- "string.h"在构建适用于iOS的qt应用程序中找不到消息
- 如何将 Firebase 与基于 Linux 的客户端应用配合使用,以便与服务器进行双向消息通信
- 重新定义预定义的 errno 错误消息 (E2BIG)
- Libmosquitto publish 不会将所有消息传递到 Azure IoT Hub
- 在 capnp FlatArrayMessageReader 的对齐内存缓冲区中接收 zmq 消息