以前用mfc写的一个ftp客户端类,现在在学c#,改写其中一个函数发现老改不好,所以请教高手。函数代码如下:
BOOL CFtpClient::GetServerReply(SOCKET hSocket)
{
char szBuffer[1024] ;
int iLength ;
int iBuffer = 0 ;
BOOL bNeedReceive = true ;
char szMultiLineHead[MAX_PATH] ;
memset( szMultiLineHead , 0 ,MAX_PATH ) ;
m_strReply = ""; struct timeval timeout;
FD_SET readfd;
FD_ZERO(&readfd);
FD_SET(hSocket,&readfd);
timeout.tv_sec = 10;
timeout.tv_usec = 0; int reVal = 0;
reVal = select(0,&readfd,0,0,&timeout);
if (reVal>0)
{
while( bNeedReceive )
{
memset( szBuffer , 0 , 1024 ) ;
iBuffer = 0 ; //because the reply string possibly is multi line .
//so we must peek the reply info before receive it.
//peek the message .
if( ( iLength = recv( hSocket , szBuffer , 1024 , MSG_PEEK ) ) == SOCKET_ERROR )
return FALSE; if( iLength <= 0 )
return FALSE; replystr = ""; //find the line end .
while( szBuffer[iBuffer] != '\n' )
{
replystr+=(CString)szBuffer[iBuffer];
iBuffer ++ ;
if( iBuffer >= iLength )
break ;
}
//skip the '\n'
iBuffer ++ ;
TRACE( "%d\r\n" , iLength ) ; m_strReply += replystr+"<BR>"; //receive server reply string .
if( ( iLength = recv( hSocket , szBuffer , iBuffer , 0 ) ) == SOCKET_ERROR )
return FALSE; if( iLength < 1024 )
szBuffer[iLength] = 0 ;
else
szBuffer[1023] = 0 ; //notify the parent wnd.
//SendMsgToParentWnd( szBuffer , false ) ; if( strlen( szMultiLineHead ) == 0 )
{
nReplyCode = GetReplyCode( szBuffer ) ;
itoa(nReplyCode , szMultiLineHead , 10 ) ;
if( szBuffer[3] == '-' )
bNeedReceive = true ;
else
bNeedReceive = false ;
}
else
{
if( strncmp( szMultiLineHead , szBuffer , 3 ) == 0 )
{
if( szBuffer[3] == '-' )
bNeedReceive = true ;
else
bNeedReceive = false ;
}
else
bNeedReceive = true ;
} }
} nReplyCode = GetReplyCode ( szBuffer ) ; //return nReplyCode ;
if(replystr.GetLength()>0)
m_pFireWallCheck=replystr.GetAt(0)-48;
return TRUE;
}
BOOL CFtpClient::GetServerReply(SOCKET hSocket)
{
char szBuffer[1024] ;
int iLength ;
int iBuffer = 0 ;
BOOL bNeedReceive = true ;
char szMultiLineHead[MAX_PATH] ;
memset( szMultiLineHead , 0 ,MAX_PATH ) ;
m_strReply = ""; struct timeval timeout;
FD_SET readfd;
FD_ZERO(&readfd);
FD_SET(hSocket,&readfd);
timeout.tv_sec = 10;
timeout.tv_usec = 0; int reVal = 0;
reVal = select(0,&readfd,0,0,&timeout);
if (reVal>0)
{
while( bNeedReceive )
{
memset( szBuffer , 0 , 1024 ) ;
iBuffer = 0 ; //because the reply string possibly is multi line .
//so we must peek the reply info before receive it.
//peek the message .
if( ( iLength = recv( hSocket , szBuffer , 1024 , MSG_PEEK ) ) == SOCKET_ERROR )
return FALSE; if( iLength <= 0 )
return FALSE; replystr = ""; //find the line end .
while( szBuffer[iBuffer] != '\n' )
{
replystr+=(CString)szBuffer[iBuffer];
iBuffer ++ ;
if( iBuffer >= iLength )
break ;
}
//skip the '\n'
iBuffer ++ ;
TRACE( "%d\r\n" , iLength ) ; m_strReply += replystr+"<BR>"; //receive server reply string .
if( ( iLength = recv( hSocket , szBuffer , iBuffer , 0 ) ) == SOCKET_ERROR )
return FALSE; if( iLength < 1024 )
szBuffer[iLength] = 0 ;
else
szBuffer[1023] = 0 ; //notify the parent wnd.
//SendMsgToParentWnd( szBuffer , false ) ; if( strlen( szMultiLineHead ) == 0 )
{
nReplyCode = GetReplyCode( szBuffer ) ;
itoa(nReplyCode , szMultiLineHead , 10 ) ;
if( szBuffer[3] == '-' )
bNeedReceive = true ;
else
bNeedReceive = false ;
}
else
{
if( strncmp( szMultiLineHead , szBuffer , 3 ) == 0 )
{
if( szBuffer[3] == '-' )
bNeedReceive = true ;
else
bNeedReceive = false ;
}
else
bNeedReceive = true ;
} }
} nReplyCode = GetReplyCode ( szBuffer ) ; //return nReplyCode ;
if(replystr.GetLength()>0)
m_pFireWallCheck=replystr.GetAt(0)-48;
return TRUE;
}
解决方案 »
- 关闭了设计窗口之后只剩下代码了,怎么打开设计窗口
- js打印的原理
- 算法挑战
- 用DataGrid控件中ItemCommand命令进行处理后,再点击分页按钮时,他响应的是ItemCommand事件而不是_PageIndexChanged事件,请问有没有解
- 对程序集“DevComponents.DotNetBar”进行强名称验证失败。
- 正则问题
- 我的软件是用C#编写的,数据库是ACCESS,可我如何编写不同的用户使用,
- 如何暂时挂起(不触发)控件的事件
- C# 的C/S程序,服务器查询数据库后,程序假死
- 一个简单的问题!! 再线等待!!
- 困扰已久的问题!各位高手请帮帮我,拜托了!!!!
- DataGridView行选择的问题
很方便的 你直接调用就行了
封装好的东西我觉得够灵活