Chinaunix首页 | 论坛 | 博客
  • 博客访问: 334777
  • 博文数量: 117
  • 博客积分: 650
  • 博客等级: 中士
  • 技术积分: 738
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-21 13:07
文章分类

全部博文(117)

文章存档

2014年(2)

2013年(2)

2012年(112)

2010年(1)

分类: C/C++

2012-02-15 22:13:08

/*
* http.c by Onway 2011-11-14
* 1,间隔1秒的两次connect避免瞬间造成的错误
* 2,网络读写超时限制参考自《UNIX环境高级编程》第二版中文版程序清单10-8,
* 由于程序是单线程,避免进程堵塞。
* 3,返回值说明
* 0 正确返回
* 1 网络连接失败
* 2 网络IO超时
* 3 时钟注册失败
*/
#include
"global.h"
#include
<sys/types.h>
#include
<sys/socket.h>
#include
<netinet/in.h>
#include
<arpa/inet.h>
#include
<unistd.h>
#include
<stdlib.h>
#include
<setjmp.h>

#define PORT 80
#define BUFFSIZE 10086

static void sig_alrm(int);
static jmp_buf env_alrm;

int QueryWord(const GString *word,const GString *ip,
GString
*gstrHtml)
{
g_string_erase(gstrHtml,
0,-1);

/* http 请求 */
GString
*request = g_string_new("GET /search?q=");
g_string_append(request,word
->str);
g_string_append(request,
"\
&ue=utf8&keyfrom=dict.index HTTP/1.1\r\n\
Host: dict.youdao.com\r\n\
Connection: close\r\n\
\r\n
");

/* 网络地址 */
struct sockaddr_in address;
address.sin_family
= AF_INET;
address.sin_addr.s_addr
= inet_addr(ip->str);
address.sin_port
= htons(PORT);

/* 网络连接 */
int socketfd = socket(AF_INET,SOCK_STREAM,0);
if(connect(socketfd,(struct sockaddr *)&address,sizeof(address)) != 0)
{
sleep(
1);
if(connect(socketfd,(struct sockaddr *)&address,sizeof(address)) != 0)
{

g_string_free(request,TRUE);
return 1;
}
}

/* 信号注册 */
if(signal(SIGALRM,sig_alrm) == SIG_ERR)
{
g_string_free(request,TRUE);
close(socketfd);
return 3;
}
if(setjmp(env_alrm) != 0)
{
g_string_free(request,TRUE);
close(socketfd);
return 2;
}

/* 网络IO */
alarm(
3);
write(socketfd,request
->str,request->len);

char buf[BUFFSIZE];
int n;
while( (n = read(socketfd,buf,BUFFSIZE)) > 0 )
g_string_append_len(gstrHtml,buf,n);
alarm(
0);

/* 正常返回 */
g_string_free(request,TRUE);
close(socketfd);
return 0;
}
static void sig_alrm(int signo)
{
longjmp(env_alrm,
1);
}
阅读(2221) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~