首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

用HTTP POST下传一个TXT文件到服务器的代码。不知道错哪了

2012-10-26 
用HTTP POST上传一个TXT文件到服务器的代码。不知道哪里错了不知道哪里错了服务器返回参数不正确,请大家帮

用HTTP POST上传一个TXT文件到服务器的代码。不知道哪里错了
不知道哪里错了服务器返回参数不正确,请大家帮忙看看。

C/C++ code
// httpupload.cpp : 定义 DLL 应用程序的导出函数。 
//

#include "stdafx.h"
#include "httpupload.h"


#pragma comment(lib ,"Ws2_32.lib")

#define  SEND_RQ(MSG)  send(sock,MSG,strlen(MSG),0);

Chttpupload::Chttpupload()
{
return;
}

DWORD Chttpupload::GetHttpHeader(SOCKET &sock, char (&header)[65535])
{
DWORD nResponseHeaderSize;
char c = 0;
int nIndex = 0;
BOOL bEndResponse = FALSE;
while(!bEndResponse && nIndex < 1024)
{
recv(sock,&c,1,0);
header[nIndex++] = c;
if(nIndex >= 4)
{
if( header[nIndex - 4] == '\r' &&
header[nIndex - 3] == '\n' &&
header[nIndex - 2] == '\r' &&
header[nIndex - 1] == '\n')
bEndResponse = TRUE;
}
}

header[nIndex]=0;
nResponseHeaderSize = nIndex;
return nResponseHeaderSize;
}

BOOL Chttpupload::ConnectServer(string &strHostAddr, int iPort, string &strtext)
{
// 套接字初始化.
WORD wVersionRequested = MAKEWORD(2,2);
WSADATA wsaData;
SOCKADDR_IN saServer;          // 服务器套接字地址.
PHOSTENT phostent = NULL;  // 指向HOSTENT结构指针.

// 初始化WinSock.
if (WSAStartup(wVersionRequested, &wsaData)!=0)
{
OutputDebugString("WSAStartup\n");
}

// 检查 WinSock 版本.
if (wsaData.wVersion != wVersionRequested)
{
OutputDebugString("WinSock version not supported\n");
WSACleanup();
return FALSE;
}

//创建套接字
SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
if(sock == INVALID_SOCKET)
{
OutputDebugString("Fail to create socket.\n");
return FALSE;
}

//写目标地址
saServer.sin_family = AF_INET;
saServer.sin_addr.s_addr  = inet_addr(strHostAddr.c_str());
saServer.sin_port = htons(iPort);

//连接
if(SOCKET_ERROR == connect(sock, (const sockaddr*)&saServer, sizeof(sockaddr)))
{
OutputDebugString("Cannot connect to remote host.");
closesocket(sock);
WSACleanup();
return FALSE;
}

//发送http post
char* temp = new char[sizeof("POST  HTTP/1.1\r\n")+strHostAddr.size()];
sprintf(temp, "POST %s HTTP/1.1\r\n", strHostAddr.c_str());
SEND_RQ(temp);
SEND_RQ( "Accept:  image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, application/vnd.ms-excel, application/vn\r\n ");
SEND_RQ( "Accept-Language:  gb2312\r\n ");
SEND_RQ( "Content-Type:  multipart/byteranges; boundary=THIS_STRING_SEPARATES\r\n ");
SEND_RQ( "UA-CPU: x86\r\n");
SEND_RQ( "Accept-Encoding:  gzip,  deflate\r\n ");
SEND_RQ( "User-Agent:  Mozilla/4.0\r\n ");
SEND_RQ( "Host:  ");
SEND_RQ(strHostAddr.c_str());
SEND_RQ( "\r\n ");
SEND_RQ("Content-Length: ");
char  length[4];
sprintf(length, "%d",strtext.length());
SEND_RQ(length);
SEND_RQ("\r\n");
SEND_RQ("Connection: keep_Alive\r\n");
SEND_RQ("Cache-Control: no-cache\r\n");
SEND_RQ( "\r\n");

char* tem = new char[strtext.length()+100];
sprintf(tem, "--THIS_STRING_SEPARATES\r\nContent-type: text/plain\r\n\r\n%s\r\n--THIS_STRING_SEPARATES\r\n", strtext.c_str());


SEND_RQ(tem);
SEND_RQ( "\r\n ");

char buffer[65535];
if (!GetHttpHeader(sock, buffer))
{
return FALSE;
closesocket(sock);
WSACleanup();
}
if (strstr(buffer, "201")!=NULL)
{
OutputDebugString("Fail to create file on the server.\r\n");
closesocket(sock);
WSACleanup();
return FALSE;
}
closesocket(sock);
WSACleanup();


return TRUE;

}



[解决办法]
学习了,仔细检查一下呀
[解决办法]
send试过么
[解决办法]
长了就不想看了。

[解决办法]
这个地方有误 
 char* tem = new char[strtext.length()+100];
sprintf(tem, "--THIS_STRING_SEPARATES\r\nContent-type: text/plain\r\n\r\n%s\r\n--THIS_STRING_SEPARATES\r\n", strtext.c_str());
SEND_RQ(tem); 
SEND_RQ( "\r\n "); 
修改为:
 char* tem = new char[strtext.length()+100];
sprintf(tem, "--THIS_STRING_SEPARATES\r\nContent-type: text/plain\r\n\r\n%s\r\n--THIS_STRING_SEPARATES--\r\n", strtext.c_str());
SEND_RQ(tem); 
SEND_RQ( "\r\n "); 

就是最后一个THIS_STRING_SEPARATES后面要加--
[解决办法]
//发送http post
char* temp = new char[sizeof("POST HTTP/1.1\r\n")+strHostAddr.size()];
sprintf(temp, "POST %s HTTP/1.1\r\n", strHostAddr.c_str());
这个地方也不对,因为strHostAddr是主机的地址;比如你要post数据到http://127.0.0.1/a.htm,这个地方要修改成:
char* temp = new char[sizeof("POST /a.htm HTTP/1.1\r\n")];
sprintf(temp, "POST /a.htm HTTP/1.1\r\n");

[解决办法]
通常失败都是构建的HTTP数据包问题,可以用FIDDLER抓一下HTTP上传时的数据包,然后再用模拟上传POST操作
[解决办法]
SEND_RQ( "Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, application/vnd.ms-excel, application/vn\r\n "); 
这句改为 SEND_RQ( "Accept: */*\r\n ");

SEND_RQ( "Accept-Language: gb2312\r\n "); 
上面这句不要

SEND_RQ( "Content-Type: multipart/byteranges; boundary=THIS_STRING_SEPARATES\r\n "); 
这句改为:SEND_RQ( "multipart/form-data; boundary=THIS_STRING_SEPARATES\r\n "); 

SEND_RQ( "Accept-Encoding: gzip, deflate\r\n "); 
上面这句,如果你上传的数据是压缩的就要这句,如果没有压缩,就不要这句;

要使用POST方式
[解决办法]
SEND_RQ( "Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, application/vnd.ms-excel, application/vn\r\n ");
这句改为 SEND_RQ( "Accept: */*\r\n ");

SEND_RQ( "Accept-Language: gb2312\r\n ");
上面这句不要

SEND_RQ( "Content-Type: multipart/byteranges; boundary=THIS_STRING_SEPARATES\r\n ");
这句改为:SEND_RQ( "Content-Type: multipart/form-data; boundary=THIS_STRING_SEPARATES\r\n ");

SEND_RQ( "Accept-Encoding: gzip, deflate\r\n ");
上面这句,如果你上传的数据是压缩的就要这句,如果没有压缩,就不要这句;

要使用POST方式

[解决办法]
检查你的服务器配置吧,wininet的代码没问题。。

热点排行