简体   繁体   English

传输端已连接错误:带有connect()的错误106

[英]Transport end already connected error : 106 with connect()

I have started implementing a server-client model with UNIX domain sockets of SOCK_STREAM type. 我已经开始使用SOCK_STREAM类型的UNIX域套接字实现服务器-客户端模型。

Thanks in advance 提前致谢

You need to avoid connecting again if your socket is already connected, you can keep some flag in your client code that indicates your client socket is already connected or not, based on that skip connecting again. 如果您的套接字已经连接,则需要避免再次连接,您可以在客户端代码中保留一些标志,以基于再次跳过连接来指示您的客户机套接字已经连接。

I have edited your server code below to show what I am trying to say in comments(You need to put accepted fd in select read set too, so that you can check any of clients posted any data, also you have multiple clients connected to you so you will have to keep accepted sockets in an array): 我已经在下面编辑了您的服务器代码以显示我要在注释中说的内容(您也需要将接受的fd放入选择的读取集中,以便可以检查任何发布了任何数据的客户端,并且您有多个客户端连接因此您必须将可接受的套接字保存在数组中):

int cltfdlen = 0;
int cltfds[FD_SETSIZE];
int maxFD = sockfd;
  int sun_path_size = sizeof(client_address.sun_path);
  client_address.sun_family = AF_UNIX;
  strncpy(client_address.sun_path, SOCKET_NAME, sun_path_size);
  client_len = sizeof(client_address);

  cli_interval.tv_sec = 60;
  cli_interval.tv_usec = 0;

while (1) {

   FD_ZERO(&read_fds);
   FD_SET(sockfd, &read_fds);
   for(i=0;i<cltfdlen;cltfdlen++)
    FD_SET(cltfds[i], &read_fds);
   int activity = select(maxFD + 1, &read_fds, NULL, NULL, &cli_interval);

   if ((activity < 0) && (errno !=EINTR)) {
     printf("socket select failed errno %d\n", errno);
     return 1;
   }

if (FD_ISSET(sockfd, &read_fds)) {
    cli_sockfd = accept(sockfd,
            (struct sockaddr *)&client_address,
            &client_len);
    if(cli_sockfd < 0) {
        printf("accept from IPC socket failed");
        return 1;
    }
    else
    {
        cltfds[cltfdlen++] = cli_sockfd;
        if(maxFD < cli_sockfd)
           maxFD = cli_sockfd 
        continue;
    }
}
    msg = (msg_t *) malloc(sizeof(msg_t));
    if (msg == NULL) {
        printf("Memory allocation failed for msg");
        close(ipc_sockfd);
        ipc_sockfd = -1;
        return 1;
    }

    memset(msg, 0, sizeof(msg));
    for(i=0;i<cltfdlen;i++)
    {
    if(FD_ISSET(cltfds[i], &read_fds))
    {
        if (read(cltfds[i], (void *)msg, sizeof(msg_t)) == -1) {
            printf("Read from IPC socket failed");
            return 1;
        }
    }
    }

    close(cli_sockfd);
    cli_sockfd = -1;

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM