C言語でのHTTPクライアントの実装例です。
以下の手順でリモートのサーバと通信し、データを取得します。
- gethostbyname()によりドメイン名からIPアドレスを引く
- socket() によりソケットを開く
- connect() によりサーバに接続する
- write() でサーバにリクエストを送る
- read() でレスポンスを受信する
- close() によりソケットを閉じる
#include <stdio.h>
#include <stdlib.h>
#include <string.h> /* bzero */
#include <sys/types.h> /* netinet/in.h */
#include <sys/socket.h> /* AF_INET */
#include <netinet/in.h> /* sockaddr_in */
#include <netdb.h> /* gethostbyname */
#include <sys/uio.h>
#include <sys/param.h>
#include <unistd.h>
#define DESTSERV "localhost"
#define DESTPORT 80
#define MESSAGE "GET / HTTP/1.0\r\nHOST: localhost\r\n\r\n"
#define BUF_LEN 1024
int main() {
struct hostent *hostent;
struct sockaddr_in server;
int fd;
char buf[BUF_LEN]; /* receive buffer */
hostent = gethostbyname(DESTSERV); /* lookup IP */
if (hostent == NULL ) {
fprintf(stderr, "Cannot resolve %s.\n", DESTSERV);
return 0;
}
bzero(&server, sizeof(server)); /* zero clear struct */
server.sin_family = AF_INET;
/* server.sin_addr = hostent->h_addr */
bcopy(hostent->h_addr, &server.sin_addr, hostent->h_length);
server.sin_port = htons(DESTPORT);
if ( ( fd = socket(AF_INET, SOCK_STREAM, 0) ) < 0) {
fprintf(stderr, "Cannot make socket.\n");
return 0;
}
if ( connect(fd, (struct sockaddr *)&server, sizeof(server)) == -1) {
fprintf(stderr, "Cannot connect.\n");
return 0;
}
write(fd, MESSAGE, strlen(MESSAGE));
/* Receive data */
while (read(fd, buf, BUF_LEN) > 0) {
printf("%s", buf);
}
close(fd);
return 0;
}
サーバ側の実装例については、「C言語でSocket間通信 echoサーバを作る」に記載しています。
参考書籍
![]() 猫でもわかるネットワークプログラミング |
![]() UNIXネットワークプログラミング入門 |

