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个字节作为第一个数据包,剩下的放在缓冲区内,等下次收到了数据,再一起读出来