bind error : Cannot assign requested address

xt646449830 2013-09-13 04:01:26
代码如下
int send_dns_answer_to_client(char *dns_packet_buf,int len,struct dns_packet_msg *p_msg)
{
int sockfd = 0;
int reuse = 1;
struct sockaddr_in cli;
struct sockaddr_in src_addr;
if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
{
printf("socket error!\n");
return 1;
}

memset((char *)&src_addr, 0 ,sizeof(src_addr));
src_addr.sin_family = AF_INET;
src_addr.sin_addr.s_addr = inet_addr("202.103.24.68"); //htonl(INADDR_ANY);
src_addr.sin_port = htons(DNS_PORT);

setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse));

if (bind(sockfd, (struct sockaddr *)&src_addr, sizeof(src_addr)) < 0)
{
perror("bind error ");
return 1;
}

memset((char *)&cli, 0 ,sizeof(cli));
cli.sin_family = AF_INET;
cli.sin_addr.s_addr = inet_addr(p_msg->srcip);
cli.sin_port = htons(p_msg->port);

if (sendto(sockfd, dns_packet_buf, len, 0, (struct sockaddr *)&cli, sizeof(cli)) == -1)
{
perror("udp_client_send data error!\n");
return 1;
}
close(sockfd);
return 0;
}


    src_addr.sin_addr.s_addr = inet_addr("202.103.24.68");  //htonl(INADDR_ANY);
这一行,我要设置ip,不用pc的ip能实现不,现在报错 Cannot assign requested address
...全文
1160 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ZhouYates 2016-03-31
  • 打赏
  • 举报
回复
linux下面肯定不行,bind了就不能connect;windows下面用管理员权限运行试试看,应该可以。至于指定特定的本地IP,估计是有问题的。
二零一四Tenc 2013-09-13
  • 打赏
  • 举报
回复
楼上说的情况我遇到过,你等一会儿再运行,或者重新换一个端口试试
max_min_ 2013-09-13
  • 打赏
  • 举报
回复

客户端频繁的连服务器,由于每次连接都在很短的时间内结束,导致很多的TIME_WAIT,以至于用光了可用的端 口号,所以新的连接没办法绑定端口,即“Cannot assign requested address”。是客户端的问题不是服务器端的问题。通过netstat,的确看到很多TIME_WAIT状态的连接。

可见问题不在于server端,而是client端频繁建立连接,而端口释放较慢,导致建立新连接时无可用端口。

网上的解决方法:

执行命令修改如下2个内核参数 (需要root权限) 
sysctl -w net.ipv4.tcp_timestamps=1  开启对于TCP时间戳的支持,若该项设置为0,则下面一项设置不起作用
sysctl -w net.ipv4.tcp_tw_recycle=1  表示开启TCP连接中TIME-WAIT sockets的快速回收

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧