加入收藏 | 设为首页 | 会员中心 | 我要投稿 拼字网 - 核心网 (https://www.hexinwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

UDP套接字的源和目标端口?

发布时间:2021-01-12 11:20:28 所属栏目:Linux 来源:网络整理
导读:我正在通过编写一个将DNS查询发送到指定服务器的小应用程序来学习C.以下是网络代码的示例: int send_query(){ int sockfd; struct sockaddr_in server; if ((sockfd = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP)) 这可以正常工作,因为查询已成功发送,并收到回

我正在通过编写一个将DNS查询发送到指定服务器的小应用程序来学习C.以下是网络代码的示例:

int send_query()
{
    int sockfd;
    struct sockaddr_in server;

    if ((sockfd = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP)) < 0) {
            perror("cannot create socketn");
    }

    memset(&server,sizeof(server));
    server.sin_family = AF_INET;
    server.sin_port = htons(53);
    inet_pton(AF_INET,"8.8.8.8",&(server.sin_addr));

    sendto(sockfd,const void *buffer,size_t length,(struct sockaddr *) &server,sizeof(server));
}

这可以正常工作,因为查询已成功发送,并收到回复.但是,通过使用Wireshark嗅探流量,我可以看到消息:目标无法访问(端口无法访问).

我发现我可以通过在sendto()之前调用bind()来避免这种情况:

int send_query()
{
    int sockfd;
    struct sockaddr_in server;

    if ((sockfd = socket(AF_INET,&(server.sin_addr));

    if(bind(sockfd,sizeof(server)) < 0) {
            perror("bind failedn");
    }

    sendto(sockfd,sizeof(server));
   }

现在,目标无法访问(端口不可达)消息已消失,但应用程序必须以root权限运行,因为它将绑定到端口53.

是否可以修改代码,以便使用随机的非特权源端口?

问题解决了

由于一个愚蠢的错误,问题出现了.我只是简单地注释掉了recvfrom().当我在测试应用程序时嗅探流量时,我可以看到计算机上的响应和错误,并且在应用程序正在接收时错误地混淆了这一点.因为我不知道我到底在做什么,所以我开始乱用bind()等等,这种失败的雪崩开始了.

为简洁起见,我没有发布所有代码,但如果这样做了,问题可能会立即得到解决.

最佳答案 您可以绑定到端口0,让操作系统随机选择一个可用的(就像INADDR_ANY为0).见https://stackoverflow.com/a/1077305/3543692

此外,绑定到端口53是没有意义的. 53端口是DNS服务器的端口,而不是DNS客户端.假设您的计算机上的所有DNS客户端都使用53作为DNS客户端端口,那么只能同时对服务器发送一个DNS请求.通常,所有客户端(均为TCP / UDP)使用OS分配的随机未使用端口.

(编辑:拼字网 - 核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!