■課題4:ソケットおよびHTMLを使ってWWWサーバから任意のURLのページを取得し,標準出力に出力するプログラムを作成せよ.


■プログラム

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>

#define BUF 256 /*バッファのサイズ*/

int main(int argc, char *argv[]){
int p;
struct hostent *servhost; /*ホスト名とIPアドレスを扱うための構造体*/
struct sockaddr_in server; /*ソケットを扱うための構造体*/
struct servent *service; /*httpなどのサービスを扱うための構造体*/

char send_buf[BUF]; /*サーバに送るバッファ*/
char host[BUF] = "ホスト"; /*接続するホスト名*/
char path[BUF] = "/"; /*要求するパス*/
unsigned short port = 80;/*接続するポート*/

if ( argc > 1 ){
char host_path[BUF];

if ( strstr(argv[1], "http://") &&
sscanf(argv[1], "http://%s", host_path) &&
strcmp(argv[1], "http://" ) ){
char *t;

t = strchr(host_path, '/'); /*ホストとパスの区切り*/
if ( t != NULL ){
strcpy(path, t); /* / 以降の文字列をpathにコピー*/
*t = '¥0';
strcpy(host, host_path); /* / 以前の文字列をhostにコピー*/
}
}
}

servhost = gethostbyname(host); /*IPアドレスのようなホストの情報を取得*/
if ( servhost == NULL ){
fprintf(stderr, "[%s] には接続できません¥n", host);
return 0;
}

bzero(&server, sizeof(server)); /*ゼロクリア*/

server.sin_family = AF_INET;

bcopy(servhost->h_addr, &server.sin_addr, /*IPアドレスを示す構造体をコピー*/
servhost->h_length);

if ( port != 0 ){
server.sin_port = htons(port);
} else {
service = getservbyname("http", "tcp");
if ( service != NULL ){
server.sin_port = service->s_port;
} else {
server.sin_port = htons(80);
}
}

/*ソケット生成*/

if ( ( p = socket(AF_INET, SOCK_STREAM, 0) ) < 0 ){
fprintf(stderr, "ソケットの生成に失敗しました。¥n");
return 1;
}

/*サーバに接続*/

if ( connect(p, (struct sockaddr *)&server, sizeof(server)) ==
-1 ){
fprintf(stderr, "接続に失敗しました。¥n");
return 1;
}

/*HTTPプロトコルを生成し、サーバに送信*/

sprintf(send_buf, "GET %s HTTP/1.0¥r¥n", path);
write(p, send_buf, strlen(send_buf));

sprintf(send_buf, "Host: %s:%d¥r¥n", host, port);
write(p, send_buf, strlen(send_buf));

sprintf(send_buf, "¥r¥n");
write(p, send_buf, strlen(send_buf));

/*受信&表示*/

while (1){
char buf[BUF];
int size;
size = read(p, buf, BUF);
if ( size > 0 ){
write(1, buf, size);
} else {
break;
}
}
close(p);
return 0;
}

■実行結果

[nw0443:~/HTTP] j04043% ./httpget http://www.google.co.jp/
HTTP/1.0 200 OK
Cache-Control: private
Content-Type: text/html
Set-Cookie: PREF=ID=567753a22a9f7095:TM=1138349910:LM=1138349910:S=0WL-qx3I6qqDJaUg; expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.com
Server: GWS/2.1
Date: Fri, 27 Jan 2006 08:18:30 GMT
Connection: Close

<html><head><meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"><title>Google</title><style><!--
body,td,a,p,.h{font-family:arial,sans-serif;}
.h{font-size: 20px;}
.q{color:#0000cc;}
//-->
</style>
<script>
<!--
function sf(){document.f.q.focus();}
// -->
</script>
</head><body bgcolor=#ffffff text=#000000 link=#0000cc vlink=#551a8b alink=#ff0

〜略〜

window.onresize = stickyAd;
//-->
</script>

<img src="http://image.click.livedoor.com/adi/images/default.gif">