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


ソースプログラム

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

#define BUF 1024

int main(int argc, char *argv[]){
int page;
struct hostent *servhost;
struct sockaddr_in server;
struct servent *service;

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], "") &&
sscanf(argv[1], "%s", host_path) &&
strcmp(argv[1], "" ) ){
char *j;

j = strchr(host_path, '/');
if ( j != NULL ){
strcpy(path, j);
*j = '\0';
strcpy(host, host_path);
}
}
}

servhost = gethostbyname(host);
if ( servhost == NULL ){
fprintf(stderr, "[%s] に接続できませんでした。\n", host);
return 0;
}

bzero((char *)&server, sizeof(server));

server.sin_family = AF_INET;

bcopy(servhost->h_addr, (char *)&server.sin_addr,
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 ( ( page = socket(AF_INET, SOCK_STREAM, 0) ) < 0 ){
fprintf(stderr, "ソケットの生成に失敗しました。\n");
return 1;
}

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

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

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

sprintf(send_buf, "\r\n");
write(page, send_buf, strlen(send_buf));

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



実行結果

[nw0553:~] j05053% ./a.out www.yahoo.co.jp/
Trying 210.80.243.19...
Connected to www.yahoo.co.jp.
Escape character is '^]'.
GET /index.html HTTP/1.0

HTTP/1.1 200 OK
Date: Sat, 09 Dec 2006 04:33:43 GMT
P3P: policyref="http://privacy.yahoo.co.jp/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi
TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"
Expires: -1
Pragma: no-cache
Cache-Control: no-cache
Connection: close
Content-Type: text/html; charset=euc-jp;

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
<!--京-->
<title>Yahoo! JAPAN</title>

〜〜〜〜〜中略〜〜〜〜〜

</body>

</html>
<!-- p03.f1.top.mci.yahoo.co.jp uncompressed Sat Dec 9 13:33:43 JST 2006 -->
Connection closed by foreign host.



戻る