linux sendto 指定源端口,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 socket\n");

}

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 Failed\n");

}

sendto(sockfd,sizeof(server));

}

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

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

问题解决了

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值