- 论坛徽章:
- 1
|
如何用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状态,可知道具体原因。 |
|