C言語-TCPサーバ



TCPサーバ

1, socket()を実行してTCPソケットを作成する。

2, bind()をを実行してソケットにポート番号を割り当てる

3, listen()を実行してポート番号への接続を作成できることをシステムに伝える。

4, クライアントからの接続要求に対して、accept()を呼び出して新しいソケットを取得する。

5, ソケットを介してクライアントと通信を行う。

6, close()を実行してクライアントとの接続を終了する。


サーバソケットの作成

static int 
skt_svsock_init(unsigned short port, rcl_err_t *err)
{
    struct sockaddr_in sv_addr = {0};
    int sock = 0;
    int rc = 0;

    sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
    if( sock < 0 ){
        rcl_error_setinfo(RCL_ERR_LOC, err, "socket() failure");
        return(-1);
    }   

    memset(&sv_addr, 0, sizeof(sv_addr));
    sv_addr.sin_family      = AF_INET;
    sv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    sv_addr.sin_port        = htons(port);

    rc = bind(sock, (struct sockaddr *)&sv_addr, sizeof(struct sockaddr));
    if( rc < 0 ){
        rcl_error_setinfo(RCL_ERR_LOC, err, "bind() failure");
        close(sock);
        return(-1);
    }   

    rc = listen(sock, SOCK_MAX_PENDING);
    if( rc < 0 ){
        rcl_error_setinfo(RCL_ERR_LOC, err, "listen() failure");
        close(sock);
        return(-1);
    }   

    return(sock);
}

接続要求を受け付ける

static int
accept_connection(int sv_sock, rcl_err_t *err)
{
    struct sockaddr_in cl_addr = {0};
    int cl_sock = 0;
    unsigned int len = 0;
    int rc = 0;

    /* 入出力パラメータのサイズを取得する */
    len = sizeof(cl_addr);

    /* 接続要求を待つ */
    cl_sock = accept(sv_sock, (struct sockaddr *)&cl_addr, &len );
    if(cl_sock < 0){
        rcl_error_setinfo(RCL_ERR_LOC, err, "accept() failure");
        return( -1 );
    }

    /* 接続開始 */
    fprintf(stdout, "Handling client = %s\n", inet_ntoa(cl_addr.sin_addr));

    return(cl_sock);
}


関連

C言語-ソケットプログラミング





スポンサード リンク