Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 服务器端的客户端地址为空_C_Sockets_Client Server_Getaddrinfo - Fatal编程技术网

C 服务器端的客户端地址为空

C 服务器端的客户端地址为空,c,sockets,client-server,getaddrinfo,C,Sockets,Client Server,Getaddrinfo,我正在尝试一个简单的客户机-服务器程序。在客户端,我绑定到一个特定的地址。在服务器端,当我接受连接时,客户端地址被接收为空。我在客户端和服务器端使用getaddrinfo获取服务器的IP地址 以下是客户端代码的一个片段: s = getaddrinfo(argv[1], argv[2], &hints, &result); if (s != 0) { fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(s)); ex

我正在尝试一个简单的客户机-服务器程序。在客户端,我绑定到一个特定的地址。在服务器端,当我接受连接时,客户端地址被接收为空。我在客户端和服务器端使用
getaddrinfo
获取服务器的IP地址

以下是客户端代码的一个片段:

s = getaddrinfo(argv[1], argv[2], &hints, &result);
if (s != 0) {
    fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(s));
    exit(EXIT_FAILURE);
}

int sockfd =0;
struct sockaddr_in localaddr;
localaddr.sin_family = AF_INET;
localaddr.sin_addr.s_addr = inet_addr("<local_ip_address>");
localaddr.sin_port = 0;  // Any local port will do

for (rp = result; rp != NULL; rp = rp->ai_next) {
     sfd = socket(rp->ai_family, rp->ai_socktype,
                  rp->ai_protocol);

if (bind(sfd, (struct sockaddr *)&localaddr, sizeof(localaddr)) !=0)
  perror("failed to bind");

if (connect(sfd, rp->ai_addr, rp->ai_addrlen) != -1)
{
        printf("connect success %d \n",  rp->ai_family);
        break;                  /* Success */
}

   close(sfd);
}

当我执行该程序时,我看到
getnameinfo
返回的错误是未知的。我使用gdb检查了
clientaddr
。它将族显示为0。
clientaddr
中的所有数据均为空。

您正在传递addrlen zero以接受呼叫。您需要将addrlen分配给addrlen=sizeof(clientaddr)

关于ipv6的说明(如果您希望支持它)。ipv6地址大于
struct sockaddr
。您可能需要使用
addrlen=sizeof(struct sockaddr\u in6);马洛克(阿德伦)
可以获取整个地址信息,即使它是ipv6地址。
memset(&hints, 0, sizeof(struct addrinfo));
hints.ai_family = AF_UNSPEC;    /* Allow IPv4 or IPv6 */
hints.ai_socktype = SOCK_STREAM; /* Datagram socket */
hints.ai_flags = AI_PASSIVE ;    /* For wildcard IP address */
hints.ai_protocol = IPPROTO_TCP;          /* Any protocol */
hints.ai_canonname = NULL;
hints.ai_addr = NULL;
hints.ai_next = NULL;

s = getaddrinfo(NULL, argv[1], &hints, &result);
if (s != 0) {
    fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(s));
    exit(EXIT_FAILURE);
}
for (rp = result; rp != NULL; rp = rp->ai_next) {

    sfd = socket(rp->ai_family, rp->ai_socktype,
            rp->ai_protocol);
    if (sfd == -1)
        continue;

   if (bind(sfd, rp->ai_addr, rp->ai_addrlen) == 0)
   {
      printf("bind success\n");

        break;                  /* Success */
    }
 }

listen(sfd, 10);


struct sockaddr clientaddr;
socklen_t addrlen=0;
int port;
memset(&clientaddr, 0, sizeof(clientaddr));
int        connfd = accept(sfd,
                    &clientaddr,
                    &addrlen);

 s=getnameinfo((struct sockaddr *)&clientaddr, addrlen,
        clienthost, sizeof(clienthost),
        clientservice, sizeof(clientservice),
        NI_NUMERICHOST);
   if (s == 0)
    printf("Received request from host=[%s] port=[%d]\n",
           clienthost, clientservice);
    else
        fprintf(stderr, "getnameinfo: %s\n", gai_strerror(s));
struct sockaddr clientaddr;
socklen_t addrlen=0;
int port;
memset(&clientaddr, 0, sizeof(clientaddr));
addrlen = sizeof(clientaddr);
int        connfd = accept(sfd,
                    &clientaddr,
                    &addrlen);