我正在尝试实现一个简单的客户端服务器应用程序,在该应用程序中,客户端或服务器可以在单个write()
调用中发送动态数量的字节。
例如,假设客户端发送了1500个字节的字节流。服务器每1000字节读取一次。
int BUFFER_SIZE = 1000;
...
read( iSockFD, cBuffer, BUFFER_SIZE );
我可以使用循环并调用read直到其返回值为0
。但是客户端可能在一个循环中有多个write()
调用(即发送多个消息)。
我的问题是,这会影响服务器端的read()
吗?意思是,将在服务器端由缓冲区大小为2000字节的单个write()
读取在客户端的两个连续的read()
1000字节吗?
如果是这种情况,建议采用什么方法来实现这种情况?我应该为消息使用分隔符(使用编码算法)吗?
我理解这与套接字本身有关,而不与C ++有关。但是,我们非常感谢您的帮助和指导。
更新:
目的是实现一个简单的中间件系统来发送不同类型的消息,其中消息将在发送之前以二进制编码。
答案 0 :(得分:1)
没有人能保证您在接收方写(x)会触发读(x)。如果x大于套接字接收缓冲区,或者如果您在套接字接收缓冲区中接收到整个消息之前调用read(),则read()将仅返回一部分数据,并要求您发出后续的read ()来获取其余的信息。
执行此操作的建议方法是定义足够大小的消息缓冲区。每次对read()的调用将返回1个或多个字节,您将继续将其排队入缓冲区。现在,一旦缓冲区大于4字节+存储在缓冲区前4个字节中的be32toh(integer),则必须消耗该整数以及从缓冲区开始处开始的后续x字节(并进一步处理它们)。这将使您能够很好地处理以下情况:read()包含先前未完成的数据包的末尾,同时包含下一(不完整)数据包的开始。
只需确保您传输的每个有效载荷都带有htobe32(长度)作为前缀。