社区
网络编程
帖子详情
sock http接收有问题
yeah2000
2008-07-07 08:23:28
程序目的是检测某个网站是否还在线,就是检测http返回信息。程序使用sock实现http,异步事件获取信息。
在本地http网页测试,有时会接收不到服务器返回信息。使用公网例如www.163.com调试状态下偶尔有接收,完全允许时,就接收不到。程序见附件,望大侠们给指点一二。
...全文
180
14
打赏
收藏
sock http接收有问题
程序目的是检测某个网站是否还在线,就是检测http返回信息。程序使用sock实现http,异步事件获取信息。 在本地http网页测试,有时会接收不到服务器返回信息。使用公网例如www.163.com调试状态下偶尔有接收,完全允许时,就接收不到。程序见附件,望大侠们给指点一二。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
打赏
举报
回复
再顶顶
SOCK
_STREAM与
SOCK
_DGRAM套接字
一、流格式套接字(
SOCK
_STREAM) 流格式套接字(Stream
Sock
ets)也叫“面向连接的套接字”,在代码中使用
SOCK
_STREAM 表示。...数据的发送和
接收
不是同步的(有的教程也称“不存在数据边界”)。 可以将 S
sock
et 中
SOCK
_STREAM 和
SOCK
_DGRAM的区别?
sock
_stream 是有保障的(即能保证数据正确传送到对方)面向连接的
SOCK
ET,多用于资料(如文件)传送。
sock
_dgram 是无保障的面向消息的
sock
et , 主要用于在网络上发广播信息。
SOCK
_STREAM是基于TCP的,数据传输比较...
TCP的request_
sock
与
sock
request_
sock
TCP服务端在
接收
到SYN报文时,调用conn_request回调处理,最终调用了tcp_conn_request函数,其分配一个request_
sock
(tcp_request_
sock
)结构体。request_
sock
之后用于TCP的三次握手,与正常的
sock
结构...
sock
et:套接字的类型
SOCK
_STREAM和
SOCK
_DGRAM
SOCK
_STREAM(流式套接字) 面向连接的套接字 ... 数据的发送和
接收
不是同步的(有的教程也称“不存在数据边界”)。
SOCK
_DGRAM(数据报格式套接字) 无连接的套接字 数据报套接字是一种不可靠的...
SOCK
_STREAM和
SOCK
_DGRAM两种类型的区别
sock
_stream 是有保障的(即能保证数据正确传送到对方)面向连接的
SOCK
ET,多用于资料(如文件)传送。
sock
_dgram 是无保障的面向消息的
sock
et , 主要用于在网络上发广播信息。
SOCK
_STREAM是基于TCP的,数据传输...
网络编程
18,356
社区成员
64,214
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章