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函数的返回值是多少吗?看看发送和接收的字节数是什么?
[解决办法]
int nReceive = 0; char buf[1452]; while (nReceive < 1452) { int nReceiveActually = recv(sock, &nReceive[nReceive], 1452 - nReceive, 0); }
[解决办法]
Send内容并不一定一次全部发送,recv也不一定一次全部接收