【发布时间】:2018-11-30 06:19:11
【问题描述】:
我正在尝试实现一个简单的客户端-服务器应用程序,其中客户端或服务器可以在单个 write() 调用中发送动态字节数。
例如,假设客户端发送一个 1500 字节的字节流。服务器每 1000 个字节读取一次。
int BUFFER_SIZE = 1000;
...
read( iSockFD, cBuffer, BUFFER_SIZE );
我可以使用循环并调用 read,直到它的返回值为 0。但是客户端可能在一个循环中有多个write()调用(即发送多条消息)。
我的问题是,它会影响服务器端的read() 吗?意思是,客户端的两个连续的 1000 字节的 write() 会被服务器端的 2000 字节缓冲区大小的单个 read() 读取吗?
如果是这样,那么推荐的实现这种场景的方法是什么?我应该对消息使用分隔符(使用编码算法)吗?
我理解这与套接字本身而不是 C++ 更相关。但是,我们非常感谢您的帮助和指导。
更新:
目的是实现一个简单的中间件系统来发送不同类型的消息,其中消息在发送之前将被编码为二进制。
【问题讨论】:
-
你必须使用一些协议来通知服务器应该读取多少字节。
-
不过,它会保证一个
write()触发一个read()吗? -
以一定的字节数和字节序(通常为 4 字节,按网络字节顺序)发送大小。
-
粘包问题。使用 TCP,您需要实现自己的方式来打包和解包数据。它可能是一个类型-长度-数据包。
-
还是保证一写()触发一读()不行。
标签: c++ sockets network-programming