套接字连接到服务器失败

时间:2012-05-02 11:48:24

标签: c sockets unix

我正在尝试在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;
}

我在main中使用它们:

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” 可能是什么原因?

1 个答案:

答案 0 :(得分:3)

您有两个主要问题:

  1. 你有一个经典的竞争条件。如果客户端在服务器设置为侦听之前尝试连接,则客户端将收到错误。

  2. 您的服务器不会检查是否有任何错误,因此可能会失败并且您不会知道。

  3. 在任何一种情况下,您都会得到正确的错误(连接被拒绝)。

    我的钱是第一个问题。如果你翻转客户端和服务器以便孩子是服务器,它可能会从“发生不工作”变为“正在发生工作”。大多数操作系统都让孩子先跑,因为这样可以节省大量的内存,并且在孩子刚刚调用exec的典型情况下可以消除大量的页面错误。