在一个连接中调用两次WSASend,一次发送了40960字节的0到客户端,一次是1,服务器每次GetQue返回的都是完整发送,所以客户端也没有乱序接收,没有模拟出ERROR_IO_PENDING情况。现在对tcp的乱序很迷惑ing。
我的想法;如果第一次投递到套接字s上的数据大于了数据缓冲区,那么操作系统锁定该区域,发送,这时候如果用户再投递一次WSASend,如果这次投递数据正好可以copy到缓冲区,则,系统会按照顺序发送还是?这时候两次数据的发送顺序是???
期待高人
我的想法;如果第一次投递到套接字s上的数据大于了数据缓冲区,那么操作系统锁定该区域,发送,这时候如果用户再投递一次WSASend,如果这次投递数据正好可以copy到缓冲区,则,系统会按照顺序发送还是?这时候两次数据的发送顺序是???
期待高人
TCP是保证顺序的。
有没有可能客户端接收的会是第一个包的一部分,第二个包的一部分??
tcp是会保证一个报文的完整性,但发送的顺序也会保证吗??
TCP协议只保证在系统缓冲中数据的顺序收发.
它是不会越位的.
是不是这样的:
//这里发送0000000
int nRet = WSASend(...);
if(nRet == SOCK_ERROR)
{
DWORD dwError = WSAGetLastError();
if(dwError == WSA_IO_PANDING)
{
//进入这里了。
}
}
//这里发送111111
nRet = WSASend(...);
if(nRet == SOCK_ERROR)
{
DWORD dwError = WSAGetLastError();
if(dwError == WSA_IO_PANDING)
{
// 这里也进入了。
}
}
////////////
BOOL bTrue = GetQueuedCompletionStatus(...);
这个时候,首先返回的有没有可能是 11111那个IO发送操作????????
这个时候按照贯列,如果返回发送出去的数据小于要发送的数据,则
wsaBuffer.buf = szBuffer+hasRecv;
wsaBuffer.len= buflen-hasRecv;
然后再WSASend数据,按照这样的程序处理方式,是不是就会出现
000001111100000呢??