我在QT中进行套接字编程,我必须devise一个协议,通过TCP / IP传输数据。
现在我的协议devise是SIMPLE,它以一种方式发送命令,每写入一次写入套接字的数据的第一个BYTE就是COMMAND。 所以每当我用socket-> write(“CDATA”)写入第一个字节时,在这种情况下,“C”意味着服务器执行某些操作的命令。
我只想知道一件事,那就是这个写是否会被分解成多个在服务器上的读取? 我知道在服务器上将有一个缓冲区大小的读取。 但是当写入在服务器的缓冲区限制内时,客户机上的socket-> write()是否可以在服务器上的多个READ中被接收?
要清除这个问题,我将给出一个例子让我们说服务器上的套接字的缓冲区读取大小是4096 BYTES。 客户端将socket-> write(“CDATA”)写入服务器。 现在有没有可能,服务器将在多于一个接收这个读取? 因为我在服务器上有一个while循环:
while{ char str[] = socket->read(); // What is the coomand in the first byte if(str[0] == "C"){ // Do something } }
如果客户端发送的数据被多次读取(即使客户端在一次写入中发送),我的协议devise将会失败
您的意见非常感谢。
是的,你应该始终考虑到你不会阅读完整的“命令”的可能性。
例如,考虑一次发送多个命令的情况。 你不知道包的边界将发生在哪里。
您需要代码来重新组合另一端的stream量,并将其分解为可处理的块。