Автоматическое назначение номера порта с помощью getaddrinfo () - PullRequest
0 голосов
/ 13 октября 2018

* (Socket Программирование) * C-код для клиента (передача сообщений через UDP) приведен ниже.Мы можем автоматически назначить номер порта сокету с помощью

  1. без вызова bind () перед sendto () (связанный пост)
  2. привязка к порту 0 (только при условиив документации по windows и solaris для bind), которая заставляет ядро ​​выполнять автоматическое назначение) в качестве 2-го аргумента порт 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);
    }
    
...