서버 소켓에서 응답이 없는경우.

antz의 이미지

코드의 일부분입니다.

    ...
    /* 클라이언트로부터의 접속을 기다린다. */
    if (listen(__sockServer, 5) == -1){
        CommonLog("ERROR : listen()\n");
        return 0;
    }
    while(TRUE)
    {
        nLength = sizeof(cli_addr);
        sockClient = accept(__sockServer, (struct sockaddr *) &cli_addr, &nLength);
        sprintf(logMsg, "Count = %04d\n", n_cnt++);
        CommonLog(logMsg);
        close(sockClient);
        continue;
    }
    ...

클라이언트 프로그램을
초당 30 User thread로 돌리면,
힘들게 돌다가...
20초 이상 대답이 없는게 가끔 발생합니다.

응답을 20초안에 하려면 어떻게 해야할까요???

감사합니다.

amister의 이미지

1. listen()의 backlog가 너무 작습니다. man listen(2) 을 잘 읽어보세요.

2. 만일 Client의 동시접속이 많을 경우, Iterative Server 구조는 적합하지 않습니다. accept() 후 connected socket에 대하여 처리를 해주는 thread를 생성하든지, select/poll 등으로 I/O Multiplexing을 해주면 쉽게 해결할 수 있습니다. man select(2), man poll(2)...

sjang의 이미지

1. listen 함수의 backlog 값을 책의 예제보고 사용하셨나요?
요즘은 시스템이 좋아져서 더 크게 하는 것이 동시접속에 효율적입니다.

2. 효율성의 문제겠지요.
그리고, select, poll를 사용한 I/O Multiplexing... 효율은 좋지만 프로그래밍 하기가
쉽지 않지요.

The Future !!!