读书人

BCB TServerSocket发送数据的无奈有关

发布时间: 2012-02-19 19:43:37 作者: rapoo

BCB TServerSocket发送数据的无奈问题
我用TServerSocket 发送数据, 有A, B, C, 三类数据, 大小分别是 (1028, 800, 740), 每次发的不同数据.
发送如下:

C/C++ code
      A a ;      B b ;      C c ;      ServerSocket1->Socket->Connetion[0]->SendBuf(&a, sizeof(a)) ;      ServerSocket1->Socket->Connetion[0]->SendBuf(&b, sizeof(b)) ;      ServerSocket1->Socket->Connetion[0]->SendBuf(&c, sizeof(c)) ;

用 TClientSocket接收, 但是ClientSocket这个控件怎么接收的时候把发过来的后两个数据打包了呢?
接收语句如下:
C/C++ code
       char buf[8000] ;           // 足够接收任何数据       int len = Socket->ReceiveBuf(buf, 8000) ;       if (sizeof(A) == len)       {          // 这里能收到数据       }       else if (sizeof(B) == len)       {          // 这里收不到数据       }       else if (sizeof(C) == len)       {          // 这里收不到数据       }       else       {          // 据观察, 这里受到了 sizeof(B) + sizeof(C) 的数据!           }


请问这是怎么回事儿呢

[解决办法]
这是很常见的TCP粘包情况
你可以设置分隔符,规定协议,去解析的你包
[解决办法]
tcp是流式协议,一个数据包可能分几次发送,也可能几个数据包合在一起发送出去。
一般都是发送时加包头包尾,接收时根据包头包尾拆分出完整数据。
[解决办法]
tcp是可靠的,保证顺序的

你可以这样,假设3种数据,第一种,发送的时候,前面加上AA,第二种,前面加上BB,第三种,前面加上CC

你先发送第一种,再发送第二种,那么就是AA.....BB......

接受的时候,可能数据一次就读完了,那么,先判断接受到的前2个数据,如果是AA,则接收1028个数据,接受完毕后,再判断剩下的前2个数据,如果是BB,则接收800个数据
[解决办法]
如果接收到1828,740,你手工读取1828中的1028个字节作为第一个数据包,剩下的放在缓冲区内,等下次收到了数据,再一起读出来

读书人网 >C++ Builder

热点推荐