首页
社区
课程
招聘
[求助]关于HttpSendRequest
发表于: 2008-7-29 21:41 17134

[求助]关于HttpSendRequest

2008-7-29 21:41
17134
MSDN里说HttpSendRequest的lpOptional参数指向的内容会紧接着协议头发送给服务器,而我写了程序用抓包工具发现附加的数据被直接接在协议头上作为一个包发出去了。而用IE登录时,协议头和附加数据是两个包,我的程序发的包人家根本找不到帐号和密码信息(我多冤枉啊,明明有的。我的数据和IE所有数据一模一样,唯一区别就是它的包被分成了两个)。
我翻了半天的MSDN,Google了半天,一直没找到解决方法。  还是说这个功能不是用HttpSendRequest实现的?
大侠帮帮忙

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 454
活跃值: (1673)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
没遇到过这种问题,HttpSendRequest是可以正常实现GET和POST的,帖完整代码来看看
2008-7-29 21:56
0
雪    币: 328
活跃值: (10)
能力值: ( LV9,RANK:370 )
在线值:
发帖
回帖
粉丝
3
void main()
{
  //登录PEDIY
  /*LPCTSTR*/TCHAR lpreferer[] = "http://bbs.pediy.com/"; //参考
  TCHAR host[] = "bbs.pediy.com"; //要访问的主机
  LPCTSTR objectname = "login.php?do=login";//NULL; //要访问的资源,访问默认页面时可使用空串
  LPCTSTR addtionheaders = "vb_login_username=Test&cookieuser=1&vb_login_password=&s=&do=login&vb_login_md5password=12341234&vb_login_md5password_utf=12341234"; //附加头

  //登录XIAONEI
/*
  /*LPCTSTR*/TCHAR lpreferer[] = "http://www.xiaonei.com/SysHome.do
"; //参考
  TCHAR host[] = "login.xiaonei.com"; //要访问的主机
  LPCTSTR objectname = "/Login.do";//NULL; //要访问的资源,访问默认页面时可使用空串
  LPCTSTR addtionheaders = "email=1234567&password=7654321&origURL=http%3A%2F%2Fwww.xiaonei.com%2FSysHome.do&submit=%E7%99%BB%E5%BD%95"; //附加头
*/
  TCHAR version[] = "HTTP/1.1"; //协议版本


  TCHAR verb[] = "POST";//"GET"; //动作
  LPCTSTR *accepttypes = NULL;

  LPCTSTR headers ="\r\n\r\n";// NULL; //头,以"\r\n\r\n"结尾

  LPVOID lpvBuffer = NULL; //用于存储返回数据的内存

  ConnectTo(host);//连接到服务器

  //建立请求
  accepttypes = (LPCTSTR *)GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT, sizeof (DWORD)*2); //数组里有两个指针
  *accepttypes = (LPCTSTR)GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT, 32);//字符串1
  strcpy ((char *)(*accepttypes), "text/*");

  hRequest = HttpOpenRequest(hConnection, verb, objectname, version, lpreferer, accepttypes, INTERNET_FLAG_KEEP_CONNECTION, 0);
  if (NULL == hRequest)
  {
    ErrorExit("HttpOpenRequest");
  }
  //添加请求
  if (!HttpAddRequestHeaders(hRequest, headers, -1, HTTP_ADDREQ_FLAG_ADD | HTTP_ADDREQ_FLAG_REPLACE))
  {
    ErrorExit("HttpAddRequestHeaders");
  }
  //发送请求
  if (!HttpSendRequest(hRequest, headers, strlen(headers), (LPVOID)addtionheaders, strlen(addtionheaders)))
  {
    ErrorExit("HttpSendRequest");
  }

#ifdef _DEBUGGING
  //查询请求的报头
  cout<<"==请求=="<<endl;
  QueryHeader(HTTP_QUERY_FLAG_REQUEST_HEADERS | HTTP_QUERY_RAW_HEADERS_CRLF);
  //查询服务器返回的报头
  cout<<"==返回=="<<endl;
  QueryHeader(HTTP_QUERY_RAW_HEADERS_CRLF);
#endif

  ReadResourses(lpvBuffer);
  printf("%s", lpvBuffer);

  GlobalFree(lpvBuffer); lpvBuffer = NULL;
  InternetCloseHandle(hRequest);
  InternetCloseHandle(hConnection);
  InternetCloseHandle(hSession);
}


发现登录看雪论坛可以,登录校内就不行了。用IE访问看雪这里请求头和登录信息是在一个包里的,访问IE请求头和登录信息是在两个包里,而且两个包是连续发出去的,不是等服务器有回应了才发第二个包的。而这个程序发出去的包是第一种情况的,所以到校内那边就用不了了~
这个问题怎么解决?是有一些设置我没打开,还是要用别的方法?

里面帐号密码部分由于众所周知的原因被我马赛克掉了,你可以换自己的帐号密码试
2008-7-30 10:13
0
雪    币: 328
活跃值: (10)
能力值: ( LV9,RANK:370 )
在线值:
发帖
回帖
粉丝
4
我妄图通过HOOK send函数手动把那个包给拆成两个,结果却是是拆成两个了,但是那它紧接着又补了一个包,所以服务器仍然不让我登录上去……

救命啊……
2008-7-31 08:12
0
雪    币: 328
活跃值: (10)
能力值: ( LV9,RANK:370 )
在线值:
发帖
回帖
粉丝
5
自己用send全部重写了……貌似没想象中的麻烦……
2008-7-31 21:21
0
游客
登录 | 注册 方可回帖
返回
//