クライアントごとに新しいプロセスを生成するのはコストが高い
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);
}