//以下注释掉的这段发送,仍然可以正常运行,但是否会给某些web server造成影响,未知 // SendString(sock,"Accept: image/gif, image/x-xbitmap," // " image/jpeg, image/pjpeg, application/vnd.ms-excel," // " application/msword, application/vnd.ms-powerpoint," // " */*\r\n"); // strcat(headerSend, "Accept: image/gif, image/x-xbitmap," // " image/jpeg, image/pjpeg, application/vnd.ms-excel," // " application/msword, application/vnd.ms-powerpoint," // " */*\r\n"); // // SendString(sock,"Accept-Language: en-us\r\n"); // strcat(headerSend, "Accept-Language: en-us\r\n"); // // SendString(sock,"Accept-Encoding: gzip, deflate\r\n"); // strcat(headerSend, "Accept-Encoding: gzip, deflate\r\n"); // // SendString(sock,"User-Agent: Mozilla/4.0\r\n"); // strcat(headerSend, "User-Agent: Mozilla/4.0\r\n"); if(postLength) { wsprintf(buffer,"Content-Length: %ld\r\n",postLength); SendString(sock,buffer); strcat(headerSend, buffer); } //SendString(sock,"Cookie: mycookie=blablabla\r\n"); // printf("Cookie: mycookie=blablabla\r\n"); SendString(sock,"Host: "); strcat(headerSend, "Host: "); SendString(sock,host); strcat(headerSend, host); SendString(sock,"\r\n"); strcat(headerSend, "\r\n"); /******************************************************** Usually, an HTTP POST include the header: Content-Type:application/x-www-form-urlencoded Without this header, some web servers (particularly ASP running on IIS) will not recognize your parameters ********************************************************/ if( (headerReceive!=NULL) && *headerReceive ) { SendString(sock,headerReceive); strcat(headerSend, headerReceive); }
SendString(sock,"\r\n"); // Send a blank line to signal end of HTTP headerReceive strcat(headerSend, "\r\n"); if( (post!=NULL) && postLength ) { send(sock,(const char*)post,postLength,0); post[postLength] = '\0';
SendString(sock,"\r\n"); // Send a blank line to signal end of HTTP headerReceive strcat(headerSend, "\r\n"); if( (post!=NULL) && postLength ) { send(sock,(const char*)post,postLength,0); post[postLength] = '\0';
{
send(sock,str,strlen(str),0);
}int Request::SendHTTP(LPCSTR url,LPCSTR headerReceive,BYTE *post,
DWORD postLength,HTTPRequest *req)
{
WSADATA WsaData;
SOCKADDR_IN sin;
SOCKET sock;
char buffer[512];
char protocol[20],host[256],request[1024];
int l,port,chars,err;
MemBuffer headersBuffer,messageBuffer;
// char headerSend[1024];
char *headerSend = NULL; BOOL done;
ParseURL(url,protocol,sizeof(protocol),host,sizeof(host), // Parse the URL
request,sizeof(request),&port);
if(strcmp(protocol,"HTTP"))
return 1; err = WSAStartup (0x0101, &WsaData); // Init Winsock
if(err!=0)
return 2; sock = socket (AF_INET, SOCK_STREAM, 0);
//if (socket == INVALID_SOCKET)
if (sock == INVALID_SOCKET)
return 3;
sin.sin_family = AF_INET; //Connect to web sever
sin.sin_port = htons( (unsigned short)port );
sin.sin_addr.s_addr = GetHostAddress(host);
//如果有代理就先连接代理服务器
// sin.sin_addr.s_addr = GetHostAddress("220.189.208.188");
// sin.sin_port = htons( (unsigned short)8080 );
//改成连接代理服务器
HKEY hkey = HKEY_CURRENT_USER;
LONG result = RegOpenKeyEx(hkey,SUBKEY,0,KEY_READ,&hkey);
if(result != ERROR_SUCCESS)
{
AfxMessageBox("Open Regkey Error!");
RegCloseKey(hkey);
return 0;
} DWORD dwEn ;
// DWORD dw ;
DWORD type = REG_DWORD;
DWORD datalen = sizeof(DWORD); //首先读出用户是否使用了代理ProxyEnable == 1使用代理
//"ProxyEnable"=dword:00000001
result = RegQueryValueEx(hkey,"ProxyEnable",NULL,&type,(LPBYTE)&dwEn,&datalen);
if (result != ERROR_SUCCESS)
{
AfxMessageBox("Read Regkey 'ProxyEnable' Error");
RegCloseKey(hkey);
return 0;
} //判断使用代理情况,1使用代理
if(dwEn != 1)
{
RegCloseKey(hkey); if( connect (sock,(LPSOCKADDR)&sin, sizeof(SOCKADDR_IN) ) )
{ return 1;
}
//printf("\r\n\r\n <<SEND HTTP REQUEST : >> \r\n\r\n"); //Send request
if( !*request )
lstrcpyn(request,"/",sizeof(request));
// 2003. 6. 12. seagate2.//保证postdata可以任意长度,防止用户提交数据过长
headerSend = (char*)malloc(1024 + postLength);
memset( headerSend, 0, 1024 + postLength);
// seagate2 end
if( post == NULL )
{
SendString(sock,"GET ");
strcpy(headerSend, "GET ");
}
else
{
SendString(sock,"POST ");
strcpy(headerSend, "POST ");
}
SendString(sock,request);
strcat(headerSend, request); SendString(sock," HTTP/1.0\r\n");
strcat(headerSend, " HTTP/1.0\r\n");
//以下注释掉的这段发送,仍然可以正常运行,但是否会给某些web server造成影响,未知
// SendString(sock,"Accept: image/gif, image/x-xbitmap,"
// " image/jpeg, image/pjpeg, application/vnd.ms-excel,"
// " application/msword, application/vnd.ms-powerpoint,"
// " */*\r\n");
// strcat(headerSend, "Accept: image/gif, image/x-xbitmap,"
// " image/jpeg, image/pjpeg, application/vnd.ms-excel,"
// " application/msword, application/vnd.ms-powerpoint,"
// " */*\r\n");
//
// SendString(sock,"Accept-Language: en-us\r\n");
// strcat(headerSend, "Accept-Language: en-us\r\n");
//
// SendString(sock,"Accept-Encoding: gzip, deflate\r\n");
// strcat(headerSend, "Accept-Encoding: gzip, deflate\r\n");
//
// SendString(sock,"User-Agent: Mozilla/4.0\r\n");
// strcat(headerSend, "User-Agent: Mozilla/4.0\r\n"); if(postLength)
{
wsprintf(buffer,"Content-Length: %ld\r\n",postLength);
SendString(sock,buffer);
strcat(headerSend, buffer);
}
//SendString(sock,"Cookie: mycookie=blablabla\r\n");
// printf("Cookie: mycookie=blablabla\r\n");
SendString(sock,"Host: ");
strcat(headerSend, "Host: "); SendString(sock,host);
strcat(headerSend, host); SendString(sock,"\r\n");
strcat(headerSend, "\r\n");
/********************************************************
Usually, an HTTP POST include the header: Content-Type:application/x-www-form-urlencoded Without this header, some web servers (particularly ASP running on IIS)
will not recognize your parameters
********************************************************/
if( (headerReceive!=NULL) && *headerReceive )
{
SendString(sock,headerReceive);
strcat(headerSend, headerReceive);
}
SendString(sock,"\r\n"); // Send a blank line to signal end of HTTP headerReceive
strcat(headerSend, "\r\n"); if( (post!=NULL) && postLength )
{
send(sock,(const char*)post,postLength,0);
post[postLength] = '\0';
strcat(headerSend, (const char*)post);
}
//strcpy(req->headerSend, headerSend);
req->headerSend = (char*) malloc( sizeof(char*) * strlen(headerSend));
strcpy(req->headerSend, (char*) headerSend );
// req->headerSend = (char*) headerSend ;
// free(req->headerSend);
// Read the result
//printf("\r\n\r\n <<RECEIVE HTTP REQUEST : >> \r\n\r\n\r\n"); // First read HTTP headerReceive MemBufferCreate(&headersBuffer );
chars = 0;
done = FALSE;
while(!done)
{
l = recv(sock,buffer,1,0);
if(l<0)
done=TRUE; switch(*buffer)
{
case '\r':
break;
case '\n':
if(chars==0)
done = TRUE;
chars=0;
break;
default:
chars++;
break;
} MemBufferAddByte(&headersBuffer,*buffer);
} req->headerReceive = (char*) headersBuffer.buffer;
*(headersBuffer.position) = 0;
{
l = recv(sock,buffer,sizeof(buffer)-1,0);
if(l<0)
break;
*(buffer+l)=0;
MemBufferAddBuffer(&messageBuffer, (unsigned char*)&buffer, l);
} while(l>0);
*messageBuffer.position = 0;
req->message = (char*) messageBuffer.buffer;
req->messageLength = (messageBuffer.position - messageBuffer.buffer);
/////////////////////////////////////////////////////////////////////////////////////////
}
else
{
char headerSend[1024]; BYTE data[100];
DWORD types = REG_SZ;
DWORD datalens = sizeof(data); //"ProxyServer"="220.189.208.188:8080"
result = RegQueryValueEx(hkey,"ProxyServer",NULL,&types,(LPBYTE)&data,&datalens);
if (result != ERROR_SUCCESS)
{
AfxMessageBox("Read Regkey 'ProxyServer' Error");
RegCloseKey(hkey);
return 0 ;
} RegCloseKey(hkey); //得到代理服务器ip和port
CString strtemp ;
CString strtemp1,strtemp2;
strtemp = data;
int i = strtemp.Find(":");
if (i == 0)
{
AfxMessageBox("can't get ':'");//"can't get key words"
}
else
strtemp1 = strtemp.Mid(0,14); strtemp2 = strtemp.Mid(15,strtemp.GetLength());
sin.sin_addr.s_addr = GetHostAddress(strtemp1);
sin.sin_port = htons( (unsigned short)atoi(strtemp2)) ; //改成连接代理服务器
if( SOCKET_ERROR == connect (sock,(LPSOCKADDR)&sin, sizeof(SOCKADDR_IN)))
{
return 4;
} if( !*request )
lstrcpyn(request,"/",sizeof(request));
if( post == NULL )
{
sprintf(headerSend, "GET http://%s",host);
SendString(sock,headerSend);
}
else
{
sprintf(headerSend, "POST http://%s",host);
SendString(sock,headerSend);
} SendString(sock,request);
strcat(headerSend, request); SendString(sock," HTTP/1.0\r\n");
strcat(headerSend, " HTTP/1.0\r\n"); SendString(sock,"Content-Type: application/x-www-form-urlencoded\r\n");
strcat(headerSend, "Content-Type: application/x-www-form-urlencoded\r\n"); SendString(sock,"User-Agent: Mozilla/4.0\r\n");
strcat(headerSend, "User-Agent: Mozilla/4.0\r\n"); SendString(sock,"Host: ");
strcat(headerSend, "Host: "); SendString(sock,host);
strcat(headerSend, host); SendString(sock,"\r\n");
strcat(headerSend, "\r\n"); if( (headerReceive!=NULL) && *headerReceive )
{
SendString(sock,headerReceive);
strcat(headerSend, headerReceive);
}
SendString(sock,"\r\n"); // Send a blank line to signal end of HTTP headerReceive
strcat(headerSend, "\r\n"); if( (post!=NULL) && postLength )
{
send(sock,(const char*)post,postLength,0);
post[postLength] = '\0';
strcat(headerSend, (const char*)post);
}
//strcpy(req->headerSend, headerSend);
req->headerSend = (char*) malloc( sizeof(char*) * strlen(headerSend));
strcpy(req->headerSend, (char*) headerSend );
// req->headerSend = (char*) headerSend ;
// free(req->headerSend);
MemBufferCreate(&headersBuffer );
chars = 0;
done = FALSE; while(!done)
{
l = recv(sock,buffer,1,0);
if(l<0)
done=TRUE; switch(*buffer)
{
case '\r':
break;
case '\n':
if(chars==0)
done = TRUE;
chars=0;
break;
default:
chars++;
break;
} MemBufferAddByte(&headersBuffer,*buffer);
} req->headerReceive = (char*) headersBuffer.buffer;
*(headersBuffer.position) = 0; MemBufferCreate(&messageBuffer); // Now read the HTTP body do
{
l = recv(sock,buffer,sizeof(buffer)-1,0);
if(l<0)
break;
*(buffer+l)=0;
MemBufferAddBuffer(&messageBuffer, (unsigned char*)&buffer, l);
} while(l>0);
*messageBuffer.position = 0;
req->message = (char*) messageBuffer.buffer;
req->messageLength = (messageBuffer.position - messageBuffer.buffer); } closesocket(sock);
return 0;
}