用影音传送带测试通过的代理服务器,用这段程序却测试不通过,但又不是所有的都不行,请各位给看看~~~BOOL CheckProxy(CString IP,int Port)
{
WSADATA ws; 
SOCKET s; 
struct sockaddr_in addr;  int iResult; 
long lResult; 
char strSubAddr[100], strBuffer[1000];  CString strtmp; lResult = WSAStartup(0x0101,&ws); 
s = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);  addr.sin_family = AF_INET; 
addr.sin_port = htons(Port);  addr.sin_addr.s_addr = inet_addr(IP); 
CString out;
out.Format("%s:%d ",IP,Port);
cout << (LPCTSTR)out;
DWORD on=1,off=0; int TimeOut=8000; 
if(::setsockopt(s,SOL_SOCKET,SO_SNDTIMEO,(char *)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR){
cout << (LPCTSTR)"连接超时\n" << endl;
return FALSE;
}
TimeOut=8000;
if(::setsockopt(s,SOL_SOCKET,SO_RCVTIMEO,(char *)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR){
cout << (LPCTSTR)"连接超时\n" << endl;
return FALSE;
}
int ret=ioctlsocket(s,FIONBIO,(unsigned long *)&on);
if(ret==SOCKET_ERROR) 
{
cout << (LPCTSTR)"连接失败\n" << endl;
return FALSE; 

iResult=connect(s,(struct sockaddr *)&addr, sizeof(addr)); 
struct timeval timeout ;
fd_set w; FD_ZERO(&w);
FD_SET(s, &w);
timeout.tv_sec = 3; //连接超时3秒
timeout.tv_usec =0;
switch (select(0, 0, &w, 0, &timeout)) 
{  
case -1:  
WSACleanup(); 
cout << (LPCTSTR)"连接超时\n" << endl;
return FALSE; 
case 0:  
WSACleanup(); 
cout << (LPCTSTR)"连接超时\n" << endl;
return FALSE; 
default:  
 if (FD_ISSET(s,&w)) 
 {  
 //连接成功   
                     
 }  
}   unsigned long ul1= 0 ;
ret = ioctlsocket(s, FIONBIO, (unsigned long*)&off); if(ret==SOCKET_ERROR){
WSACleanup(); 
cout << (LPCTSTR)"连接失败\n" << endl;
return FALSE; 
}
strcpy(strSubAddr, "GET http://www.163.com/ "); strcat(strSubAddr,"HTTP/1.0 HOST:www.163.com \r\n "); strcat(strSubAddr,"User-Agent: Mozilla/4.0"); strcat(strSubAddr," \r\n\r\n"); iResult=send(s,strSubAddr,strlen(strSubAddr),0);
strset(strBuffer,' '); 
int d=sizeof(addr);
accept(s,(struct sockaddr *)&addr, &d); 
iResult = recv(s,strBuffer,sizeof(strBuffer),0);   
int result = 0;
result =   strstr(strBuffer,"HTTP/1.0 200 OK")-strBuffer + 1; if(SOCKET_ERROR == iResult) 

   // 连接失败 
  WSACleanup(); 
  cout << (LPCTSTR)"连接失败\n" << endl;
  return FALSE; 
}
else if(result==1)
{
cout << (LPCTSTR)"连接正常\n" << endl;
}
else

   // 连接失败 
  WSACleanup(); 
  cout << (LPCTSTR)"连接失败\n" << endl;
  return FALSE; 
} return TRUE;
}

解决方案 »

  1.   

    listen(listensocket,5);
                      memset(strBuffer,0,1000);
      int d=sizeof(addr);
    // 为什么有accept()? listen()调用了吗?
    accept(s,(struct sockaddr *)&addr, &d); 
    iResult = recv(s,strBuffer,sizeof(strBuffer),0);   
    int result = 0;
    result =   strstr(strBuffer,"HTTP/1.0 200 OK")-strBuffer + 1;
                                // 这里返回的是1吗?不一定哦!
    if(SOCKET_ERROR == iResult) 

       // 连接失败 
      WSACleanup(); 
      cout << (LPCTSTR)"连接失败\n" << endl;
      return FALSE; 
    }
    else if(result==1)
    {
    cout << (LPCTSTR)"连接正常\n" << endl;
    }
    else

       // 连接失败 
      WSACleanup(); 
      cout << (LPCTSTR)"连接失败\n" << endl;
      return FALSE; 
    } return TRUE;
    }
      

  2.   

    accept 忘了弄掉了,哈哈不过测试不通过的现象是,返回http 400错误
      

  3.   

    accept 忘了弄掉了,哈哈不过测试不通过的现象是,返回http 400错误