1

Mac Os X で AF_UNIX ソケットを使用しようとしています。いくつかの情報を含む構造を作成しました。

typedef struct
{
    int socket;
    int conn;
    struct sockaddr addr;
}socket_info;

そして、私はこれらの機能を使用します:

socket_info* server_init(void)
{
  socket_info* result=(socket_info*)malloc(sizeof(socket_info));
  socklen_t length=sizeof(struct sockaddr);
  bzero(&(result->addr),sizeof(struct sockaddr));
  result->socket=socket(AF_UNIX,SOCK_STREAM,0);
  (result->addr).sa_family=AF_UNIX;
  (result->addr).sa_len=sizeof(struct sockaddr);
  strcpy((result->addr).sa_data,"./mysock");
  bind(result->socket,&(result->addr),length);
  listen(result->socket,MAX);
  result->conn=accept(result->socket,&(result->addr),&length);
  return result;
}


socket_info* client_init(socket_info* info)
{
  socket_info* result=(socket_info*)malloc(sizeof(socket_info));
  result->socket=socket(AF_UNIX,SOCK_STREAM,0);
  while( connect(result->socket,&(info->addr),sizeof(struct sockaddr))==-1)
  {
    if(errno==ENOENT)
    {
        sleep(1);
    }
    else
    {
        fprintf(stderr,"Error: %d",errno);
        free(result);
        result=NULL;
    }
  }
  return result;
}

そして、私はそれらをメインで使用します:

int main(int argc, char** argv)
{
  socket_info *server_info, *client_info;
  pid_t pid;
  int fd[2];
  pipe(fd);
  pid=fork();
  if(pid==0)
  {
    char buffer[100];
    read(fd[0], server_info, sizeof(struct sockaddr));
    client_info=client_init(server_info);
    read(client_info->socket,buffer,100);
    printf("Messaggio ricevuto: %s",buffer);
  }
  else
  {
    const char* msg="ciao";
    server_info=server_init();
    write(fd[1],server_info,sizeof(struct sockaddr));
    write(server_info->socket,msg,sizeof(msg));
  }
  close(fd[0]);
  close(fd[1]);
  return 0;
}

しかし、クライアントは接続に失敗します。代わりに、「エラー: 61」というメッセージが出力されます。
その理由は何ですか?

4

1 に答える 1

3

主な問題が 2 つあります。

  1. 古典的な競合状態があります。サーバーがリッスンするように設定する前にクライアントが接続を試みると、クライアントでエラーが発生します。

  2. サーバーはエラーをチェックしないため、失敗している可能性がありますが、それはわかりません。

どちらの場合でも、取得しているエラー (接続が拒否されました) が正確に表示されます。

私のお金は最初の問題にあります。子がサーバーになるようにクライアントとサーバーを反転すると、「うまくいかない」から「うまくいく」に変わる可能性があります。ほとんどのオペレーティング システムでは、子プロセスが最初に実行されます。これにより、大量のメモリが節約さ、子プロセスが単にexec.

于 2012-05-02T11:52:50.183 に答える