我的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 ) ) ;
}
有的站点访问时获取列表为空,把超时定到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 ) ) ;
}
解决方案 »
- 阈值分割: Yager测度极小化方法
- 请问:CListCtrl中第一个colomn前的小框怎么去掉?我是用report view
- 哪位大哥有netcat(nc.exe)程序的源码或者其实现管道反向连接的实现代码
- 求助!!!急....高手指教
- 如何给程序添加热键??? 就像金山游侠的“*”那样……(请高手指教)
- DAO中的查询问题
- ado读取数据库中一列作为comboBox的选项
- 如何实现画图软件中的“按下鼠标左键后移动鼠标,生成随鼠标位置变化的直线,而松开鼠标左键后,直线不再变化。”
- enumwindows函数怎么用?
- 线程初级问题
- 一个自动发贴机的源代码,有个奇怪问题,请高手指教,下载地址:
- 如何给工具栏按钮左边或者右边加上文本标签?
你的代码还是有问题的.
循环接收那里,一样可令你一直阻塞着.你应该将select()也放进循环中试下.