我用socket 发送http post请求后 网页返回给我响应信息.但接收到的响应信息有问题.求大神帮我看下

专写匿名信 2013-07-23 11:01:28
这是我发送,接收的代码:
wchar_t* _post(char* hostname,char* url,char* para)
{
WSADATA wsa;
wchar_t* msg;
DWORD dwNum;
/*初始化socket资源*/
if (WSAStartup(MAKEWORD(1,1),&wsa) != 0)
{
dwNum = MultiByteToWideChar (CP_ACP, 0, "初始化失败", -1, NULL, 0);
msg = new wchar_t[dwNum];
MultiByteToWideChar (CP_ACP, 0, "初始化失败", -1, msg, dwNum);
return msg; //代表失败
}
//初始化socket
SOCKET Client_Sock = socket(AF_INET, SOCK_STREAM, 0);

struct hostent* host_addr = gethostbyname(hostname);
sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons((unsigned short)80);
sin.sin_addr.s_addr = *((int*)*host_addr->h_addr_list);
int ret = connect(Client_Sock,(const struct sockaddr *)&sin,sizeof(sockaddr_in));

if(ret == -1)
{
dwNum = MultiByteToWideChar (CP_ACP, 0, "连接失败", -1, NULL, 0);
msg = new wchar_t[dwNum];
MultiByteToWideChar (CP_ACP, 0, "连接失败", -1, msg, dwNum);
return msg; //代表失败
}
//拼接请求信息
char send_str[2048] = {NULL};
strcat(send_str,"POST ");
strcat(send_str,url);
strcat(send_str," HTTP/1.1\r\n");
strcat(send_str,"Accept: */*\r\n");
strcat(send_str,"Accept-Language: zh-cn\r\n");
strcat(send_str,"host:");
strcat(send_str,hostname);
strcat(send_str,"\r\n");
strcat(send_str,"Content-Type: application/x-www-form-urlencoded\r\n");
strcat(send_str,"Content-Length:");
char len[20] = {NULL};
sprintf(len,"%d", strlen(para));
strcat(send_str,len);
strcat(send_str,"\r\n");
strcat(send_str,"Connection:keep-alive\r\n\r\n");
strcat(send_str,para);
//发送请求
if(send(Client_Sock,send_str,strlen(send_str)+1,0 ) == -1)
{
dwNum = MultiByteToWideChar (CP_ACP, 0, "发送失败", -1, NULL, 0);
msg = new wchar_t[dwNum];
MultiByteToWideChar (CP_ACP, 0, "发送失败", -1, msg, dwNum);
return msg; //代表失败
}

char cs_str[1024]={NULL};
char recv_str[8192]={NULL};
//获取网页响应内容
while(true)
{
//接收响应内容
int recv_num = recv(Client_Sock,cs_str,strlen(cs_str)+1,0 );
if(recv_num == 0)
{
break;
}
else if(recv_num <0)
{
char return_str[512] = {NULL};
char return_num[20]={NULL};
sprintf(return_num,"%d",strlen(recv_str));
strcat(return_str,return_num);
strcat(return_str,"|接收出错|");
sprintf(return_num,"%d",WSAGetLastError());
strcat(return_str,return_num);


dwNum = MultiByteToWideChar (CP_ACP, 0,return_str, -1, NULL, 0);
msg = new wchar_t[dwNum];
MultiByteToWideChar (CP_ACP, 0, return_str, -1, msg, dwNum);
return msg; //代表失败
}
//接收正常拼接字符串
strcat(recv_str,cs_str);
}
//转换字符串
dwNum = MultiByteToWideChar (CP_UTF8, 0,recv_str, -1, NULL, 0);
msg = new wchar_t[dwNum];
MultiByteToWideChar (CP_UTF8, 0, recv_str, -1, msg, dwNum);

//关闭socket
closesocket(Client_Sock);
WSACleanup();
//返回接收到的响应字符串
return msg;
}

这是我收到的网页响应内容:
HTTP/1.1 200 OK
Cache-Control: private
Content-Type: text/html; charset=utf-8
Server: Microsoft-IIS/7.5
X-AspNet-Version: 2.0.50727
X-Powered-By: ASP.NET
Date: Tue, 23 Jul 2013 02:45:00 GMT
Content-Length: 26

{"success":"已返回tdk"}cess":"HTTP/1.1 400 Bad Request
Content-Type: text/html; charset=us-ascii
Server: Microsoft-HTTPAPI/2.0
Date: Tue, 23 Jul 2013 02:45:00 GMT
Connection: close
Content-Length: 326

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD><TITLE>Bad Request</TITLE>
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
<BODY><h2>Bad Request - Invalid Verb</h2>
<hr><p>HTTP Error 400. The request verb is invalid.</p>
</BODY></HTML>
erb
我想知道红色的部分是什么东西,然后我只想保留 黄色 的字符串其他的都删掉该怎么处理就是报头与html内容都不要只要 网页响应字符串
...全文
397 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
www_adintr_com 2013-07-23
  • 打赏
  • 举报
回复
引用 4 楼 TNT_101 的回复:
可是我只 send了一次啊,怎么会发送了两次请求?
把这句 if(send(Client_Sock,send_str,strlen(send_str)+1,0 ) == -1) 改成 if(send(Client_Sock,send_str,strlen(send_str),0 ) == -1) 试试看吧. 可能后面多出的 '\0' 服务器作为另外一次请求了. 服务器返回的错误信息也是请求的类型不对.
专写匿名信 2013-07-23
  • 打赏
  • 举报
回复
可是我只 send了一次啊,怎么会发送了两次请求?
www_adintr_com 2013-07-23
  • 打赏
  • 举报
回复
包头和内容之间通过两个换行来分割的. 很好处理撒. 你这个内容是两次请求响应的哦, 先把这两次请求分开把.
专写匿名信 2013-07-23
  • 打赏
  • 举报
回复
引用 1 楼 adlay 的回复:
你调用的参数是怎么填的? 往任何网页发都会出现, 还是只有指定的网址才会出现? send 那个地方有点问题, 它返回实际发送的字节数, 是有可能小于 strlen(send_str)+1 的. 你这里没有做判断, 但应该不是导致问题的原因.
谢谢,这个问题我已经解决了.我想知道 怎么 吧 响应报头 和 后面的 html 内容 去掉 只留下 响应字符串
www_adintr_com 2013-07-23
  • 打赏
  • 举报
回复
你调用的参数是怎么填的? 往任何网页发都会出现, 还是只有指定的网址才会出现? send 那个地方有点问题, 它返回实际发送的字节数, 是有可能小于 strlen(send_str)+1 的. 你这里没有做判断, 但应该不是导致问题的原因.
专写匿名信 2013-07-23
  • 打赏
  • 举报
回复
引用 8 楼 adlay 的回复:
[quote=引用 6 楼 TNT_101 的回复:] [quote=引用 5 楼 adlay 的回复:] [quote=引用 4 楼 TNT_101 的回复:] 可是我只 send了一次啊,怎么会发送了两次请求?
把这句 if(send(Client_Sock,send_str,strlen(send_str)+1,0 ) == -1) 改成 if(send(Client_Sock,send_str,strlen(send_str),0 ) == -1) 试试看吧. 可能后面多出的 '\0' 服务器作为另外一次请求了. 服务器返回的错误信息也是请求的类型不对.[/quote] 我按照你说的更改后,recv就阻塞了,等了好长时间 WSAGetLastError() 返回了10054 的错误信息 怎么办呢?[/quote] 把 strcat(send_str,"Connection:keep-alive\r\n\r\n"); 换成 strcat(send_str,"Connection:close\r\n\r\n");[/quote] 谢谢大神的帮忙 问题都解决了
www_adintr_com 2013-07-23
  • 打赏
  • 举报
回复
引用 7 楼 TNT_101 的回复:
[quote=引用 5 楼 adlay 的回复:] [quote=引用 4 楼 TNT_101 的回复:] 可是我只 send了一次啊,怎么会发送了两次请求?
把这句 if(send(Client_Sock,send_str,strlen(send_str)+1,0 ) == -1) 改成 if(send(Client_Sock,send_str,strlen(send_str),0 ) == -1) 试试看吧. 可能后面多出的 '\0' 服务器作为另外一次请求了. 服务器返回的错误信息也是请求的类型不对.[/quote] 这个问题先放一边吧,现在我怎么根据两个换行符来区分 报头和内容呢?[/quote] 最简单的, 直接 strstr(msg, "\r\n\r\n") 就行.
www_adintr_com 2013-07-23
  • 打赏
  • 举报
回复
引用 6 楼 TNT_101 的回复:
[quote=引用 5 楼 adlay 的回复:] [quote=引用 4 楼 TNT_101 的回复:] 可是我只 send了一次啊,怎么会发送了两次请求?
把这句 if(send(Client_Sock,send_str,strlen(send_str)+1,0 ) == -1) 改成 if(send(Client_Sock,send_str,strlen(send_str),0 ) == -1) 试试看吧. 可能后面多出的 '\0' 服务器作为另外一次请求了. 服务器返回的错误信息也是请求的类型不对.[/quote] 我按照你说的更改后,recv就阻塞了,等了好长时间 WSAGetLastError() 返回了10054 的错误信息 怎么办呢?[/quote] 把 strcat(send_str,"Connection:keep-alive\r\n\r\n"); 换成 strcat(send_str,"Connection:close\r\n\r\n");
专写匿名信 2013-07-23
  • 打赏
  • 举报
回复
引用 5 楼 adlay 的回复:
[quote=引用 4 楼 TNT_101 的回复:] 可是我只 send了一次啊,怎么会发送了两次请求?
把这句 if(send(Client_Sock,send_str,strlen(send_str)+1,0 ) == -1) 改成 if(send(Client_Sock,send_str,strlen(send_str),0 ) == -1) 试试看吧. 可能后面多出的 '\0' 服务器作为另外一次请求了. 服务器返回的错误信息也是请求的类型不对.[/quote] 这个问题先放一边吧,现在我怎么根据两个换行符来区分 报头和内容呢?
专写匿名信 2013-07-23
  • 打赏
  • 举报
回复
引用 5 楼 adlay 的回复:
[quote=引用 4 楼 TNT_101 的回复:] 可是我只 send了一次啊,怎么会发送了两次请求?
把这句 if(send(Client_Sock,send_str,strlen(send_str)+1,0 ) == -1) 改成 if(send(Client_Sock,send_str,strlen(send_str),0 ) == -1) 试试看吧. 可能后面多出的 '\0' 服务器作为另外一次请求了. 服务器返回的错误信息也是请求的类型不对.[/quote] 我按照你说的更改后,recv就阻塞了,等了好长时间 WSAGetLastError() 返回了10054 的错误信息 怎么办呢?

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧