在同步状态下:
TCP协议,使用send发送数据,但是此send 函数只是把数据交给了底层来完成,却不知道数据究竟有没有成功发送,我关闭NAGLE算法,send一些数据,这样应该能够保证地层把数据发送出去吧?而据我所知,TCP可以通过对方的返回ACK数据来判断数据是否安全到达,但是,如果我可以使用什么方法可以在send后阻塞下来,不调用recv来判断数据是成功发送还是失败呢?
(例如具体这个情况下:客户端connect服务器后,拔掉服务器的网线,然后客户端send数据,我接下来怎样阻塞下来判断发送是成功还是失败?)
TCP协议,使用send发送数据,但是此send 函数只是把数据交给了底层来完成,却不知道数据究竟有没有成功发送,我关闭NAGLE算法,send一些数据,这样应该能够保证地层把数据发送出去吧?而据我所知,TCP可以通过对方的返回ACK数据来判断数据是否安全到达,但是,如果我可以使用什么方法可以在send后阻塞下来,不调用recv来判断数据是成功发送还是失败呢?
(例如具体这个情况下:客户端connect服务器后,拔掉服务器的网线,然后客户端send数据,我接下来怎样阻塞下来判断发送是成功还是失败?)
(Note that this can be less than the number indicated by nBufLen.) Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling GetLastError. 不同的GetLastError. 各不相同。你说的“如果我可以使用什么方法可以在send后阻塞下来,不调用recv来判断数据是成功发送还是失败呢?”我不理解,这两者的配套保证了正常的通信呀。。------------------------------------------
网络方面实在不怎么样,见谅。
-----网络还没入门呢--------
这时send返回成功发送字节为10,但是实际上并没有发送到对方服务器,只是交给了系统底层
客户端connect服务器后,拔掉服务器的网线,然后客户端send 发送10个字节的数据?
这时send返回成功发送字节为10,但是实际上并没有发送到对方服务器,只是交给了系统底层你这段话有问题,是同步模式的话,发送数据出去没有得到对方的确认时send就不会返回。
同意finix兄所说的!
正确返回,这些都是TCP协议做的,不需要你考虑的。
我的看法:send成功,并且返回的发送字节数与待发送字节相同,只是意味着成功把数据交给系统底层进行了传送;并不意味着已经收到了对方的ACK,甚至不能确定数据已经到达对方;我所做的实验:
运行环境:客户端,服务器端均为Windows 2000 Server;
客户端connect服务器后,
拔掉服务器的网线,然后客户端send 发送10个字节的数据,
int nSend=send(m_hSocket,pch,nSize,0);
程序顺利返回:nSend==nSize;我关闭了nagle算法,如果不关闭他,我们甚至不能保证send的数据立刻就由系统底层进行传送,系统底层可能要等到需要发送的字节到一定的数量后才真正进行传送,
而对方的ACK也不一定就是收到一个就进行ACK,它可能对连续的几个进行一次ACK,所以,何为发送成功? 为了澄清这一问题,我建议大家把这个过程也试验一下!!!!
if(ret==SOCKET_ERROR)
{
//失败
}