曾经年轻的我,认为利用udp来发送文件,自己做判断,自己做握手;结果出现的问题就是在网络状态良好的情况下可以达到7M多,但是网络一不好,就基本就玩了发送不成功。最后还是转到tcp,让tcp自己处理握手,最起码这样是稳定的。那么就要解决发送的速度问题。都认为udp快,那是因为udp不需要管数据的正确性,只要要求数据的正确性,就得做握手,还不如直接用tcp的。
正题:我们利用socket发送数据时,只关心socket是否正常运行,然后将数据扔给send就不管了。如果数据量很小,且不频繁的调用send,这样做无可厚非。但如果发文件呢?因为MTU的存在,势必不能使tcp的数据包过大,丢包重传会浪费很多时间。所以我给出的建议是,在每次发送适当的包,在每次发送前验证socket是否处于忙的状态,如果不忙则发送,如果忙,则等待,这样不会造成一直向socket发送数据,导致数据包越来越大。造成重传。
代码很简单:
fd_set l_fdset;
FD_ZERO(&l_fdset);
FD_SET(SOCKET, &fds);
int l_iState = ::select(0, NULL, &l_fdset, NULL, &timeval);
if (SOCKET_ERROR == l_iState)
{
if (0 != l_iState)
{
表示空闲,可以向socket写数据了
}
}