2018年3月6日火曜日

開発環境

Head First C ―頭とからだで覚えるCの基本 (David Griffiths (著)、Dawn Griffiths (著)、中田 秀基 (監修)、木下 哲也 (翻訳)、オライリージャパン)の11章(プロセス間通信 - お話は楽しい)、コードマグネット(p. 494)を取り組んでみる。

コードマグネット(p. 494)

//
//  main.c
//  sample
//
//  Created by kamimura on 2018/03/06.
//  Copyright © 2018 kamimura. All rights reserved.
//

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <netdb.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>

void error(char *msg) {
    fprintf(stderr, "%s: %s\n", msg, strerror(errno));
    exit(1);
}

int open_socket(char *host, char *port) {
    struct addrinfo *res;
    struct addrinfo hints;
    memset(&hints, 0, sizeof(hints));
    hints.ai_family = PF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;
    if (getaddrinfo(host, port, &hints, &res) == -1) {
        error("アドレスを解決できません");
    }
    int d_sock = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
    if (d_sock == -1) {
        error("ソケットを開ません");
    }
    int c = connect(d_sock, res->ai_addr, res->ai_addrlen);
    freeaddrinfo(res);
    if (c == -1) {
        error("ソケットに接続できません");
    }
    return d_sock;
}

int say(int socket, char *s) {
    int result = (int)send(socket, s, strlen(s), 0);
    if (result == -1) {
        fprintf(stderr, "%s: %s\n", "サーバーとの通信エラー", strerror(errno));
    }
    return result;
}

int main(int argc, const char * argv[]) {
    int d_sock = open_socket("en.wikipedia.org", "80");
    char buf[255];
    sprintf(buf, "GET /wiki/%s http/1.1\r\n", argv[1]);
    say(d_sock, buf);
    say(d_sock, "Host: en.wikipedia.org\r\n\r\n");
    char rec[256];
    int bytesRcvd = (int)recv(d_sock, rec, 255, 0);
    while (bytesRcvd) {
        if (bytesRcvd == -1) {
            error("サーバーから読み込めません");
        }
        rec[bytesRcvd] = '\0';
        printf("%s", rec);
        bytesRcvd = (int)recv(d_sock, rec, 255, 0);
    }
    close(d_sock);
    return 0;
}

入出力結果(Terminal)

$ ./client c
HTTP/1.1 400 Bad Request

$

0 コメント:

コメントを投稿