sock http接收有问题

yeah2000 2008-07-07 08:23:28

程序目的是检测某个网站是否还在线,就是检测http返回信息。程序使用sock实现http,异步事件获取信息。

在本地http网页测试,有时会接收不到服务器返回信息。使用公网例如www.163.com调试状态下偶尔有接收,完全允许时,就接收不到。程序见附件,望大侠们给指点一二。
...全文
180 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
yeah2000 2008-07-14
  • 打赏
  • 举报
回复
我试过,数据正确
就是实现不了
zzultc 2008-07-12
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 yeah2000 的回复:]
我没有使用post,我写了这个函数,但是没有调用它。我使用的是get方法。
我想用事件的方法来实现,希望能有解决办法。如果大家说行不通,那我再改。只是连接,我试过不好用。
[/Quote]
“/“必须使用“//“才能被正确编译。
如果你没有使用post,那么肯定是那个“//”没有处理好,特别是Accept字段里边。

你可以使用网络监控软件,查看一下你的程序发送的数据到底对不对。
yeah2000 2008-07-11
  • 打赏
  • 举报
回复


回复10楼:

我比较偏爱事件机制,如果事件机制解决不了,那我会采用你说的方法。



回复11楼:

好像不用转义吧?我这么调用的HTTPGet("/");然后参数就使用下面的方式赋值的。
sprintf(HTTP_Request,"GET %s HTTP/1.0",...);


我没有使用post,我写了这个函数,但是没有调用它。我使用的是get方法。




我想用事件的方法来实现,希望能有解决办法。如果大家说行不通,那我再改。只是连接,我试过不好用。


zzultc 2008-07-11
  • 打赏
  • 举报
回复
本帖子为什么没有5、6、7、8楼??
反正我是看不见,不知道为什么我以前的回复总是看不见。

你的代码:
1、“//”转义字符,你没有处理好。
2、如果只是简单的测试在线否,为什么要用post,不使用get?
你使用的post,如果数据长度为零,可能出现问题,另外,对所要post的数据,没有使用你在头中生命的编码。
ok1234567 2008-07-11
  • 打赏
  • 举报
回复
头不会有什么问题
如果是虚拟网站,必须包含host域

http是一次连接,一次收发,没有必要采用事件机制,最好采用线程机制
建议:连接时采用异步,设置超时,如果只是判断webserver是否在工作,连接上就可以立即断开
请求,最好采用同步,不过是一个send,一个recv
yeah2000 2008-07-11
  • 打赏
  • 举报
回复
继续
zzultc 2008-07-09
  • 打赏
  • 举报
回复
我发现了3处:
1、为何不用GET方法?你只是简单的判断在线而已。
2、#define HTTP_POST_FORMAT "POST %s HTTP/1.0\r\nAccept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*\r\nReferer: http://%s/\r\nAccept-Language: en-us,zh-cn;q=0.8,zh-tw;q=0.5,zh-hk;q=0.3\r\nContent-Type: application/x-www-form-urlencoded\r\nUser-Agent: Mozilla/4.0 (compatible;MSIE 5.01;Windows NT 5.0)\r\nHost: %s\r\nContent-Length: %u\r\n\r\n%s"

你的转义字符\里边部分需要使用\\,比如Accept头里。
3、HTTPPost里边:
char HTTP_Request[4096];
if(strlen(Resource)+ strlen(PostInfo)>4000)
return 0;
sprintf(HTTP_Request,HTTP_POST_FORMAT,Resource,Server,Server,strlen(PostInfo),PostInfo);
//return send(sock,HTTP_Request,strlen(HTTP_Request),0);
int k = (int)strlen(HTTP_Request);
int nReturn = socClient.SendData((BYTE*)HTTP_Request, k);
你没有把局部变量HTTP_Request初始化为零、没有对发送的PostInfo进行application/x-www-form-urlencoded编码。

真是怪了,老是发送失败!
zzultc 2008-07-09
  • 打赏
  • 举报
回复
我发现了3处:
1、为何不用GET方法?你只是简单的判断在线而已。
2、#define HTTP_POST_FORMAT "POST %s HTTP/1.0\r\nAccept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*\r\nReferer: http://%s/\r\nAccept-Language: en-us,zh-cn;q=0.8,zh-tw;q=0.5,zh-hk;q=0.3\r\nContent-Type: application/x-www-form-urlencoded\r\nUser-Agent: Mozilla/4.0 (compatible;MSIE 5.01;Windows NT 5.0)\r\nHost: %s\r\nContent-Length: %u\r\n\r\n%s"

你的转义字符\里边部分需要使用\\,比如Accept头里。
3、HTTPPost里边:
char HTTP_Request[4096];
if(strlen(Resource)+ strlen(PostInfo)>4000)
return 0;
sprintf(HTTP_Request,HTTP_POST_FORMAT,Resource,Server,Server,strlen(PostInfo),PostInfo);
//return send(sock,HTTP_Request,strlen(HTTP_Request),0);
int k = (int)strlen(HTTP_Request);
int nReturn = socClient.SendData((BYTE*)HTTP_Request, k);
你没有把局部变量HTTP_Request初始化为零、没有对发送的PostInfo进行application/x-www-form-urlencoded编码。
yeah2000 2008-07-09
  • 打赏
  • 举报
回复
搞不定,继续顶
yeah2000 2008-07-09
  • 打赏
  • 举报
回复
搞不定,继续顶
yeah2000 2008-07-09
  • 打赏
  • 举报
回复
GET / HTTP/1.0
Host: www.163.com
Accept: */*
Referer: http://www.163.com


我将头信息改成了这样,还是不行。用网络调试助手就可以。

大侠继续帮忙看看,谢谢啦
IsItNothing 2008-07-08
  • 打赏
  • 举报
回复
大概看了一下,你发送出去的http头有的信息没有填写,按找http协议填写然后再用socket发送.
yeah2000 2008-07-08
  • 打赏
  • 举报
回复
ding!!!
yeah2000 2008-07-08
  • 打赏
  • 举报
回复
再顶顶

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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