0

IRC クライアントをコーディングしています。「/server」コマンドを実装して、クライアントの接続を他のサーバーに切り替えたいと考えています。新しい接続を初期化する前に、sockect の fd を閉じたいのですが、close() 呼び出しが失敗します。誰でも私に理由を言うことができますか?これが私のコードです:

/* 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));
   }
}

どうもありがとう。

4

2 に答える 2

1

close()syscall が失敗した理由を知りたい場合はperror()、エラー メッセージを stderr にstrerror(errno)出力するか、エラー コードを文字列に変換して別の方法で出力するために使用します。

于 2013-04-23T13:57:41.740 に答える
1

ほとんどの場合、ソケット FD は無効です。その上で、およびselect() の失敗時に perror() を呼び出す必要があります。

于 2013-04-23T23:16:38.177 に答える