您好,欢迎来到[编程问答]网站首页   源码下载   电子书籍   软件下载   专题
当前位置:首页 >> 编程问答 >> C/C++ >> bind error : Cannot assign requested address

bind error : Cannot assign requested address

来源:网络整理     时间:2016/6/23 12:42:13     关键词:

关于网友提出的“ bind error : Cannot assign requested address”问题疑问,本网通过在网上对“ bind error : Cannot assign requested address”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: bind error : Cannot assign requested address
描述:

udpsocketc

代码如下
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

解决方案1:

楼上说的情况我遇到过,你等一会儿再运行,或者重新换一个端口试试

解决方案2:


客户端频繁的连服务器,由于每次连接都在很短的时间内结束,导致很多的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的快速回收

以上介绍了“ bind error : Cannot assign requested address”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/2001983.html

相关图片

相关文章