我的ftp客户端开始没用select模型,老因为阻塞死掉,现在用了select,超时定为10秒,又遇到下面的问题:
有的站点访问时获取列表为空,把超时定到120秒都还是空,但是用阻塞模式时能获取到,而且只需几秒钟。
代码如下:
BOOL CFtpClient::ReadData(SOCKET hControlSocket, SOCKET hDataSocket)
{
DWORD nByteRec = 0 ;
DWORD lDataNum = 0 ;
char ReceiveBuffer[64] ; //use CString class to store the data
CString strBuffer ; strBuffer.Empty() ; struct timeval timeout;
FD_SET readflist;
FD_ZERO(&readflist);
FD_SET(hControlSocket,&readflist);
timeout.tv_sec = 10;
timeout.tv_usec = 0; int reVal = 0;
reVal = select(0,&readflist,0,0,&timeout);
if(reVal>0)
{
do
{
memset( ReceiveBuffer , 0 , sizeof( ReceiveBuffer ) ) ;
nByteRec = recv( hDataSocket , ReceiveBuffer , 63 , 0 ) ;
if( nByteRec == SOCKET_ERROR )
break ;
if( nByteRec > 0 )
{
ReceiveBuffer[nByteRec] = 0 ;
lDataNum = nByteRec + lDataNum ;
strBuffer += ReceiveBuffer ;
}
}
while( nByteRec > 0  );
}
closesocket( hDataSocket ) ;
hDataSocket = NULL ;
m_hDataSocket = NULL ; m_listBuffer = strBuffer; if( nByteRec == SOCKET_ERROR )
return false ; if( lDataNum == 0 )
return ( GetServerReply( hControlSocket ) ) ; return ( GetServerReply( hControlSocket ) ) ;
}