免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 14320 | 回复: 5
打印 上一主题 下一主题

如何用socket 发送http请求 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-03-15 15:27 |只看该作者 |倒序浏览
这是我用套接字发送http请求的部分代码,无法正常执行完。
int main(){
int s;
char *buf;
//以下为建立tcp套接字s,并将其连接到服务器(略)



。。



//以下发送http请求;
buf="GET http://sms.sina.com.cn/xwcl.html HTTP/1.0\r\n";
write(s,buf,sizeof(s));
while(read(s,buf,sizeof(buf))
fputs(s,stdout);
}
曾经用调试工具调试过该程序,read(s,buf,sizeof(buf)语句以前一切正常,但运行到read(s,buf,sizeof(buf)语句时,就一直阻塞,运行不下去,请问是不是http 请求的格式有错?

论坛徽章:
0
2 [报告]
发表于 2003-03-15 19:50 |只看该作者

如何用socket 发送http请求

这种要看看RFC的
或是你使用监听工具看看你的WEB向HTTP发请求时的格式是怎样
参考一下

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
3 [报告]
发表于 2003-03-17 10:29 |只看该作者

如何用socket 发送http请求

ssize_t  writelen = 0,readlen =0;
.
.
.

if( ( writelen = write(s,buf,sizeof(s)) != strlen( buf ) ) {
     (void)fprintf( stderr,"write error:[%s]\n",strerror( error ) );
     /* exit或者break等*/
}
这样保证你发送的是正确的,同时到server端查看是否recv到相应的请求内容,如果没有接受到,那么问题在server。如果能正确接受,则查看server段响应请求的内容是否正确send给该client进程所对应的sockfd,如果发送成功,那么现在查看下面这个语句。
if( ( readlen = read(s,buf,sizeof(buf))  < 0 ) {
     (void)fprintf( stderr,"read error:[%d]-[%s]\n",errno,strerror( errno ) );
     /* exit或者break等*/
}
你在程序中使用while(read(s,buf,sizeof(buf)) ,你看到的现象是程序一直阻塞在这里,事实上你已经读到了东西,要不然不会阻塞的,因为read调用返回的是读到的有效字节数,假如读到了>;0的字符数,那么while将条件为真,导致阻塞,我建议你用上面的做法,如果你的server响应属于非连续或太大的数据包,你可以把上面的read调用构造再一个循环中,例如:
while ( 1 ) {
    if( ( readlen = read(s,buf,sizeof(buf))  < 0 ) {
     (void)fprintf( stderr,"read error:[%s]\n",strerror( error ) );
     break;
    }
    else {
    /*继续read*/
    /*如果你能知道每次接受的大小,比如23字节,那么用if( ( readlen != read(s,buf,sizeof(buf))  != 23 )比较好一点,可以做个计数器来控制你每次的不同读取个数 */
}
这样做的好处是如果有错误,你能够详细的跟踪出错再那里。假如read第一次就是失败了,可以通过查看read调用的errno直到一些原因,或者检查socket状态,可知道具体原因。

论坛徽章:
0
4 [报告]
发表于 2003-09-04 20:27 |只看该作者

如何用socket 发送http请求

你看看HTTP协议的报文头和结构体,有很多东西要一起送上去,要不
人家不会随便就给你发送东西的。。
   你只要按照HTTP的要求发送上那些数据,人家Server就回给你HTM 的。
net_worker 该用户已被删除
5 [报告]
发表于 2003-10-10 10:50 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
6 [报告]
发表于 2008-10-08 13:48 |只看该作者
请求最后要加两个\r\n.比如"GET http://sms.sina.com.cn/xwcl.html HTTP/1.0\r\n \r\n"
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP