socket write시 pipe시그널 발생
클라이언트 서버프로그램 작성중입니다.
기본적으로 잘돌아 가던 서버입니다.
여러 클라이언트를 문제없이 소화 시킨 서버입니다.(테스트 기간이지만)
물론 pipe시그널 무시 옵션을 주긴 했습니다.
헌데
클라이언트에서 옵션을 추가하니
두번째 접속하는 클라이언트 부터 pipe시그널을 발생시키며
먼저 접속된 클라이언트 마저 소켓 오류로 모두 종료시켜버립니다.
추가한 클라이언트 옵션은
setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (const char *)&timeout, sizeof(timeout));
입니다.
어떤 문제로 이런 현상이 발생할까요..
아래는 간략소스입니다.
<서버 Linux> { listenfd = socket(AF_INET, SOCK_STREAM, 0); .... bind(listenfd,.......); listen(listenfd, 5); while(1) { clientfd = accept(listenfd, ..........); XXXX.clientfd = clientfd; ....... pthread_create(&threadXX, NULL, clientProcess, (void*)&XXXX); } }
void *clientProcess(void *arg)
{
struct MY XXXX;
int sock;
XXXX = *((struct MY *)arg);
sock = XXXX.clientfd;
FD_ZERO(&rset);
...
while(1)
{
select(maxFD+1, &rset, &wset, NULL, NULL)
if(FD_ISSET(sock, &wset)
{
write(sock, buff, 999);
}
}
}
<클라이언트 windows XP> { sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (const char *)&timeout, sizeof(timeout)); // 위의 옵션을 추가했습니다. connect(sock, (SOCKADDR*)&sock_addr, sizeof(sock_addr)); ..... }
댓글 달기