[C言語]Socket間通信 HTTPクライアントを作る



C言語でのHTTPクライアントの実装例です。
以下の手順でリモートのサーバと通信し、データを取得します。

  1. gethostbyname()によりドメイン名からIPアドレスを引く
  2. socket() によりソケットを開く
  3. connect() によりサーバに接続する
  4. write() でサーバにリクエストを送る
  5. read() でレスポンスを受信する
  6. 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サーバを作る」に記載しています。

参考書籍

猫でもわかるネットワークプログラミング 第2版 (猫でもわかるプログラミングシリーズ)
猫でもわかるネットワークプログラミング
UNIXネットワークプログラミング入門
UNIXネットワークプログラミング入門

Comments are closed.