首页 > 解决方案 > 使用 getaddrinfo() 自动分配端口号

问题描述

*(套接字编程)*客户端的C代码(通过UDP传递消息)如下所示。我们可以通过以下方式自动为套接字分配端口号

  1. 在 sendto() 之前不调用 bind() (相关帖子)
  2. 与端口 0 绑定(仅在 windows 和 solaris 文档中提供用于绑定),使内核进行自动分配。相关帖子

但是,对 getaddrinfo() 函数执行相同操作,将“0”(端口号)作为第二个参数传递会将端口 0 分配给套接字,而不是任何 USER_RESERVED 端口。

如何使用 getaddrinfo() 实现自动端口分配?

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<netdb.h>

int main(int argc,char *argv[])
{
    struct addrinfo client,*cl;
    int status;


    memset(&client,0,sizeof(client));//stucture should be empty

    client.ai_family=AF_INET;
    client.ai_socktype=SOCK_DGRAM;
    client.ai_flags=AI_PASSIVE;

    if(getaddrinfo(INADDR_ANY,"0",&client,&cl)!=0)
    {
        fprintf(stderr,"getaddrinfo: %s\n",gai_strerror(status));
        return 2;
    }

    int s;
    //printf("Port:: %d\n",((struct sockaddr_in*)(cl->ai_addr))->sin_port); //checking protocol number
    s=socket(cl->ai_family,cl->ai_socktype,cl->ai_protocol);
    //printf("Port:: %d\n",((struct sockaddr_in*)(cl->ai_addr))->sin_port); //checking protocol number

    //bind(s,cl->ai_addr,cl->ai_addrlen);
    //printf("Port:: %d\n",((struct sockaddr_in*)(cl->ai_addr))->sin_port); //checking protocol number

    struct sockaddr_in server;
    server.sin_family=AF_INET;
    inet_pton(AF_INET,argv[1],&(server.sin_addr));
    server.sin_port=htons(4169);
    char str[100];
    for(int i=2;i<argc;i++)
    {
        strncat(str,argv[i],strlen(argv[i]));
        str[strlen(str)]=' ';
    }

    sendto(s,str,strlen(str),0,(struct sockaddr *)&server,(socklen_t)sizeof(server));
    //printf("Port:: %d\n",((struct sockaddr_in*)(cl->ai_addr))->sin_port); //checking protocol number

    close(s);
}

标签: socketsudpclient

解决方案


推荐阅读