sockets - 使用 getaddrinfo() 自动分配端口号
问题描述
*(套接字编程)*客户端的C代码(通过UDP传递消息)如下所示。我们可以通过以下方式自动为套接字分配端口号
但是,对 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);
}
解决方案
推荐阅读
- reactjs - Jest/Enzyme ReactJS 测试表单控制选项
- mongodb - 有人可以解释这个 MongoClient.connect 代码是如何工作的吗?
- javascript - 将 Angular 应用程序从 6 升级到 10 更新后会产生很多错误
- django - 为什么我在 Django 中不断收到“列 _id 不存在”错误?
- ruby-on-rails - 未定义的局部变量,但变量已定义
- delphi - 终止“睡眠”线程
- php - Laravel eloquent 使用关系列更新列
- python - 将特定行旋转到列中
- python - 使用带有 SQS 代理的 prometheous 客户端监视在 celery worker 上运行的任务
- ruby - 破折号/连字符在 Ruby 中重置 FTP#list 中的路径