2018年2月28日水曜日

開発環境

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

自分で考えてみよう(p. 473)

//
//  main.c
//  sample1
//
//  Created by kamimura on 2018/02/28.
//  Copyright © 2018 kamimura. All rights reserved.
//

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

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

int main(int argc, const char * argv[]) {
    char *advice[] = {
        "advice1\r\n",
        "advice2\r\n",
        "advice3\r\n",
        "advice4\r\n",
        "advice5\r\n"
    };
    int listener_d = socket(PF_INET, SOCK_STREAM, 0);
    if (listener_d == -1) {
        error("ソケットを開けません");
    }
    struct sockaddr_in name;
    name.sin_family = PF_INET;
    name.sin_port = (in_port_t)htonl(30000);
    name.sin_addr.s_addr = htonl(INADDR_ANY);
    int c = bind(listener_d, (struct sockaddr *)&name, sizeof(name));
    if (c == -1) {
        error("ソケットにバインドできません");
    }
    if (listen(listener_d, 10) == -1) {
        error("接続待ちできません");
    }
    puts("接続を待っています");
    while (true) {
        struct sockaddr_storage cliend_addr;
        unsigned int address_size = sizeof(cliend_addr);
        int connect_d = accept(listener_d, (struct sockaddr*)&cliend_addr, &address_size);
        if (connect_d == -1) {
            error("第二のソケットを開ません");
        }
        char *msg = advice[rand() % 5];
        if (send(connect_d, msg, strlen(msg), 0) == -1) {
            error("send");
        }
        close(connect_d);
    }
    return 0;
}

入出力結果(Terminal)

$ ./server 
接続を待っています
  C-c C-c
$

0 コメント:

コメントを投稿