2013-04-23 4 views
0

IRC 클라이언트를 코딩 중이며 "/ 서버"명령을 구현하여 내 클라이언트의 연결을 다른 서버로 전환하고 싶습니다. 새 연결을 초기화하기 전에 sockect의 fd를 닫으려고하지만 close() 호출이 실패합니다. 아무도 왜 나 한테 말할 수 있니? 다음은 내 코드입니다 :select() 후 소켓 닫기

/* Main execution loop */ 
FD_ZERO(&irc->rdfs); 
FD_SET(STDIN_FILENO, &irc->rdfs); 
FD_SET(irc->socket_fd, &irc->rdfs); 
if ((select(irc->socket_fd + 1, &irc->rdfs, NULL, NULL, NULL)) == -1) 
{ 
    if ((close(irc->socket_fd)) == -1) 
    exit(usage(CLOSE_ERROR)); 
    exit(usage(SELECT_ERROR)); 
} 
if (FD_ISSET(STDIN_FILENO, &irc->rdfs)) 
{ 
    fgets(irc->buffer, SIZE - 1, stdin); 
    { 
    p = strstr(irc->buffer, RET); 
    if (p != NULL) 
     *p = 0; 
    else 
     irc->buffer[SIZE - 1] = 0; 
    } 
    write_on_server(irc, irc->buffer); /* The function where I call switch_server() in */ 
} 
else if (FD_ISSET(irc->socket_fd, &irc->rdfs)) 
{ 
    if ((read_on_server(irc)) == 0) 
    exit(usage(SERVER_DISCONNECT)); 
    puts(irc->buffer); 
} 

그리고 여기 내 소켓의 FD 닫으려고 어디 :

void   switch_server(t_irc *irc) 
{ 
if ((close(irc->socket_fd)) == -1) /* This is the close which fail */ 
    exit(EXIT_FAILURE); 
} 

void   write_on_server(t_irc *irc, const char * buffer) 
{ 
if (!(strncmp("/server", buffer, strlen("/server")))) 
    switch_server(irc); 
else 
    if ((send(irc->socket_fd, buffer, strlen(buffer), 0)) < 0) 
    { 
    if ((close(irc->socket_fd)) == -1) 
     exit(usage(CLOSE_ERROR)); 
    exit(usage(CLIENT_SEND_ERROR)); 
    } 
} 

덕분에 많이. 당신이 close() 같은 콜이 실패한 이유 문자열 출력이 다른 방법에 오류 코드를 변환하는 strerror(errno)를 stderr에 오류 메시지를 인쇄 할 perror()를 사용하거나, 알고 싶은 경우

답변

1

거의 확실하게 소켓 FD가 유효하지 않습니다. select() 실패시 perror()에 을 호출해야합니다.