socket数据包传送问题(很奇怪的现象,与缓冲区有关吗?)
没开代理与开代理两种情况:
1.没开代理前
windowns 下客户端 循环send 一个1452字节 的数据包过去给 linux 服务端,服务端那边能正常的把 1452字节 这个包完整的接下来
2.开代理后
windowns 下客户端 循环send 一个1452字节 的数据包过去给 linux 服务端,服务端那边就不能正常的把 1452字节 这个包完整的接下来,有时候接收到的包 只有 1360字节 有时候会接收到 1452字节 ,而有时候会一直接收到的是1360字节 这个大小的封包。
这是什么原因呢,是不是linux服务端 recv接收的缓冲区问题,他是不是有个为1452字节大小的缓冲区,而我客户端向他连续传送1452字节的封包,服务端那边接收了第一个封包后,缓冲区刚好占满了,当他再去接收客户端传来的第二个封包,由于服务端的缓冲区还没来得及清空完,只清空了1360字节的空间,那么第二个封包服务端那边接收到的也只能接收1360字节,而第三个封包过来后,服务端的接收缓冲区又像接收第二个封包一样,缓冲区只清空到1360字节,接下来就会出现我上面说的这种情况呢?
[解决办法]
发送和接收都应该是循环的,直到发送和接收结束
[解决办法]
你的程序中有判断一下send、recv函数的返回值是多少吗?看看发送和接收的字节数是什么?
[解决办法]
[解决办法]
你没有理解LS几位解释的循环的意思,
你的循环是指每次发送1452字节,
而你的问题需要解决的是,1452字节需要用一个循环来发送。
因为你send(1452)如果返回值 <1452,就说明一次send没有发全1452,需要再send把剩余部分继续发完。
[解决办法]
lz肯定是循环send了,
但是recv的话,lz要确保是否recv完毕了。
lz是否有包头等封包,里面含有包命令字,包长度等信息,这样recv端就可以根据长度进行recv了。
[解决办法]
tcp的机制就是这样的,你要收1452个字节的数据就应该循环去收,直到1452,使用代理的情况下有可能代理把你的数据拆分了一下来进行发送的,都是流数据嘛,自己进行下处理就行了。
- C/C++ code
int nReceive = 0; char buf[1452]; while (nReceive < 1452) { int nReceiveActually = recv(sock, &nReceive[nReceive], 1452 - nReceive, 0); }
[解决办法]
Send内容并不一定一次全部发送,recv也不一定一次全部接收