LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 969|回复: 3

如何用C来连接http服务器?

[复制链接]
发表于 2006-3-13 14:18:02 | 显示全部楼层 |阅读模式
想做一个程序是关于压力测试的,刚学C不久,最后能给段示范代码.
发表于 2006-3-14 00:10:03 | 显示全部楼层
usage: ./webclient www.ynu.edu.cn
or ./webclient 202.203.208.36
------------------------------------------------------------------------------------------------------------------------------
#include "stdio.h"
#include "string.h"
#include "stdarg.h"
#include "sys/socket.h"
#include "netinet/in.h"
#include "netdb.h"

int htconnect(char *domain,int port)
{
        int white_sock;
        struct hostent * site;
        struct sockaddr_in me;
        site=gethostbyname(domain);
        if(site==NULL)
                return -2;
        white_sock=socket(AF_INET,SOCK_STREAM,0);
        if(white_sock<0)
                return -1;
        memset(&me,0,sizeof(struct sockaddr_in));
        memcpy(&me.sin_addr,site->h_addr_list[0],site->h_length);
        me.sin_family=AF_INET;
        me.sin_port=htons(port);
        return (connect(white_sock,(struct sockaddr *)&me,sizeof(struct sockaddr))<0)?-1:white_sock;
};

int htsend(int sock,char *fmt,...)
{
        char BUF[1024];
        va_list argptr;
        va_start(argptr,fmt);
        vsprintf(BUF,fmt,argptr);
        va_end(argptr);
        return send(sock,BUF,strlen(BUF),0);
};

void main(int argc, char **argv)
{
        int black_sock;
        char bugs_bunny[3];
        if(argc<2)
        {
                printf("usage :\t %s <URL>\n",argv[0]);
                return 1;
        }
        black_sock=htconnect(argv[1],80);
        if(black_sock<0)
        {
                printf("black_sock error\n");
                return 1;
        }
        htsend(black_sock,"GET/HTTP/1.0%c",10);
        htsend(black_sock,"Host:%s%c",argv[1],10);
        htsend(black_sock,"%c",10);
        while(read(black_sock,bugs_bunny,1)>0)
                printf("%c",bugs_bunny[0]);
        close(black_sock);
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-14 09:18:07 | 显示全部楼层
真是太感谢你了!呵呵  我去试试.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-3-14 14:05:14 | 显示全部楼层
这里我有个疑问,
memset(&me,0,sizeof(struct sockaddr_in));
memcpy(&me.sin_addr,site->h_addr_list[0],site->h_length);

这段是否可以用
me.sin_addr=*((struct in_addr *)site->h_addr_list[0]);代替那?
为什么我也编了类似的代码,可是用内存复制的就好用,而用下面这段代码就处问题那?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表