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()
를 사용하거나, 알고 싶은 경우