【ただの技術備忘録】【第2回】LinuxC、ソケットプログラミング初歩

予告どおり、さくっとプログラムを記載。このプログラムは基本的にLinuxGCCで組むので、Widows諸君はWinsockの参考書片手に、概念だけ理解していただけると助かる。

サーバプログラム「server.c」

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>

int main (int argc, char *argv[])
{
    //ソケットファイルディスクリプタ
    int server_sockfd, client_sockfd;
    //ソケットサイズ代入用変数
    int server_len, client_len;
    //ソケットの構造体
    struct sockaddr_in server_address;
    struct sockaddr_in client_address;

    //ソケットを生成
    server_sockfd = socket(AF_INET,SOCK_STREAM ,0);

    //ソケット構造体にパラメータを設定
    server_address.sin_family = AF_INET;
    server_address.sin_addr.s_addr = inet_addr("127.0.0.1");
    server_address.sin_port = 7743;

    //構造体のサイズを取得
    server_len = sizeof(server_address);

    //ソケットファイルディスクリプタとソケット構造体を結びつけ
    //俗に言う「ソケットに名前をつける」行為だと思う
    bind(server_sockfd,(struct sockaddr *)&server_address,server_len);

    //接続キューを作成する
    //この場合は接続キューを5個作成
    listen(server_sockfd,5);

    //無限ループ
    while(1) {
        //受信用変数、送信用変数
        char recv;
        char send;

        //接続要求を受け入れる
        client_len = sizeof(client_address);
        client_sockfd = accept(server_sockfd, (struct sockaddr *)&client_address, &client_len);

        //なんか処理
        //client_sockfdから受信変数に1バイト読み込み
        //インクリメントして送信変数に代入
        //client_sockfdに送信変数から1バイト書き込み
        read(client_sockfd, &recv,1);
        send = recv+1;
        write(client_sockfd, &send, 1);

        //クライアントソケットを閉じる
        close(client_sockfd);
    }
}

クライアントプログラム「client.c」

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>

int main (int argc, char *argv[])
{
    //ソケットファイルディスクリプタ
    int sockfd;
    //ソケットサイズ代入用変数
    int len;
    //ソケットの構造体
    struct sockaddr_in address;
    //接続結果代入用変数
    int result;
    //受信用変数、送信用変数
    char send = 'a';
    char recv;

    //ソケットを生成
    sockfd = socket(AF_INET, SOCK_STREAM, 0);

    //ソケット構造体にパラメータを設定
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = inet_addr("127.0.0.1");
    address.sin_port = 7743;

    //構造体のサイズを取得
    len = sizeof(address);

    //サーバに接続要求を出す
    //許可されれば接続する
    result = connect(sockfd,(struct sockaddr *) &address, len);

    //接続許可が下りなければ
    //-1が返ってくるのでエラー処理
    if(result == -1) {
        printf("Server connection err\n");
        exit(1);
    }

    //送受信
    write(sockfd,&send,1);
    read(sockfd,&recv,1);

    //受信したものを表示
    printf("Recv:%c\n",recv);

    //接続を閉じる
    close(sockfd);
    return 0;
}

解説は次回。