Eukleides project

from http://d.hatena.ne.jp/u5_h/

(network関係)httpクライアント

perlを読みながらCで作ってみました。ちょっとしたオプションをつけました。
今回もエラー処理は全くしていないのでご注意。



#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
int main(int argc, char *argv[])
{
struct sockaddr_in addr;
struct hostent *host;
char http_res[1024];
char target_uri[1025];
char *tar_host;

int sd = socket(AF_INET,SOCK_STREAM,0);
strcpy(target_uri, "/");
tar_host=argv[1];
host=gethostbyname(tar_host);
memset(&addr, '\0', sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(80);
memcpy*1;

send(sd, "GET ", strlen("GET "), 0);
send(sd, target_uri, strlen(target_uri), 0);
send(sd, " HTTP/1.0", strlen(" HTTP/1.0"), 0);
send(sd, "\r\n", strlen("\r\n"), 0);
send(sd, "Host: ", strlen("Host: "), 0);
send(sd, tar_host, strlen(tar_host), 0);
send(sd, "\r\n", strlen("\r\n"), 0);
send(sd, "\r\n", strlen("\r\n"), 0);
FILE *fp1,*fp2;
fp2=fopen("sample.html","w");
fprintf(fp2,"");
fclose(fp2);
fp1=fopen("sample.html","a");
while (recv(sd, http_res, sizeof(http_res), 0))
{
printf("%s",http_res);
fprintf(fp1,"%s",http_res);
memset(&http_res, '\0', sizeof(http_res));
}
fclose(fp1);
close(sd);
return 0;
}

実行結果
www.google.co.jpの場合
bash-3.00$ ./httptest www.google.co.jp
HTTP/1.0 200 OK
Cache-Control: private
Content-Type: text/html
Set-Cookie: PREF=ID=87b7303f2aa5541f:TM=1152122845:LM=1152122845:S=ggJ_IYPDLHaaM
Of6; expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.co.jp
Server: GWS/2.1
Date: Wed, 05 Jul 2006 18:07:25 GMT
Connection: Close

S">Google

p[\iCYh z[ 

 

ight=1>




ソーシャル・ネットワーキングサイト [mixi(ミクシィ)]




ソーシャル・ネットワーキングサイト [mixi(ミクシィ)]


*1:char *)&addr.sin_addr,(char *)host->h_addr,host->h_length); connect(sd,(struct sockaddr *)&addr,sizeof(addr