[TCP/IP] クライアントごとにスレッド作成

クライアントごとに新しいプロセスを生成するのはコストが高い
OSはプロセス作成の度にメモリ、スタック、ファイルなどを状態をコピーしなければならないため

#include "TCPEchoServer.h"
#include <pthread.h> /* posixスレッドに必要 */

void *ThreadMain(void *arg);

struct ThreadArgs {
    int clntSock;
};

int main(int argc, char *argv[]){

    int servSock;
    int clntSock;
    unsigned short echoServPort;
    pthread_t threadID;
    struct ThreadArgs *threadArgs; /* スレッドの引数構造体 */

    if(argc != 2) {
        fprintf(stderr, "Usage: %s <SERVER PORT>\n", argv[0]);
        exit(1);
    }

    echoServPort = atoi(argv);

    servSock = CreateTCPServerSocket(echoServPort);

    for(;;){
        clntSock = AcceptTCPConnection(servSock);

        /* クライアント引数用にメモリを確保 */
        if((threadArgs = (struct ThreadArgs *) malloc(sizeof(struct ThreadArgs)))==NULL)
            DieWithError("malloc() failed")
        threadArgs -> clntSock = clntSock;

        /* クライアントスレッド生成 */
        if(pthread_create(&threadID, NULL, ThreadMain, (void *) threadArgs) != 0)
            DieWithError("pthread_create() failed");
        printf("with thread %ld\n", (long int) threadID);
    }
}

void *TheadMain(void *threadArgs) {
    int clntSock;

    pthread_detach(pthread_self());

    clntSock = ((struct ThreadArgs *) threadArgs) -> clntSock;
    free(threadArgs);

    HandleTCPClient(clntSock);

    return (NULL);
}