2013-03-18 110 views
3

我正在尝试编写一个侦听我的机器上的端口的C程序。 我遇到了一个奇怪的错误。绑定失败:无法分配请求的地址

每当我尝试将套接字绑定到固定IP(127.0.0.1或我的实际IP)时,出现"bind failed: Cannot assign requested address"错误。 但是,当我将INADDR_ANY传递给绑定为绑定的地址时,它起作用。

这些是我拥有的唯一两个IP,所以它不能是0.0.0.0,因为我有一些其他IP地址可用。

下面是代码:

#include<sys/types.h> 
#include<stdio.h> 
#include<sys/socket.h> 
#include<netinet/in.h> 
#include<errno.h> 
#include<stdlib.h> 
#include<string.h> 
int main() 
{ 
    int port = 1234; /* port number */ 
    int rqst;  /* socket accepting the request */ 
    socklen_t alen;  /* length of address structure */ 
    struct sockaddr_in my_addr; /* address of this service */ 
    struct sockaddr_in client_addr; /* client's address */ 
    int sockoptval = 1; 

    int svc; 


    /* create a TCP/IP socket */ 
    if ((svc = socket(AF_INET, SOCK_STREAM, 0)) < 0) { 
     perror("cannot create socket"); 
     exit(1); 
    } 

    /* allow immediate reuse of the port */ 
    setsockopt(svc, SOL_SOCKET, SO_REUSEADDR, &sockoptval, sizeof(int)); 

    /* bind the socket to our source address */ 
    memset((char*)&my_addr, 0, sizeof(my_addr)); /* 0 out the structure */ 
    my_addr.sin_family = AF_INET; /* address family */ 
    my_addr.sin_port = htons(port); 
    //my_addr.sin_addr.s_addr = htonl(INADDR_ANY); /* Works! */ 
    my_addr.sin_addr.s_addr = htonl(inet_addr("127.0.0.1")); /* Fails! */ 

    if (bind(svc, (struct sockaddr *)&my_addr, sizeof(my_addr)) < 0) { 
     perror("bind failed"); 
     exit(1); 
    } 

    printf("Listening on %d\n", my_addr.sin_addr.s_addr); 
    /* set the socket for listening (queue backlog of 5) */ 
    if (listen(svc, 5) < 0) { 
     perror("listen failed"); 
     exit(1); 
    } 

    /* loop, accepting connection requests */ 
    for (;;) { 
     while ((rqst = accept(svc, (struct sockaddr *)&client_addr, &alen)) < 0) { 
      /* we may break out of accept if the system call */ 
         /* was interrupted. In this case, loop back and */ 
         /* try again */ 
         if ((errno != ECHILD) && (errno != ERESTART) && (errno != EINTR)) { 
           perror("accept failed"); 
           exit(1); 
         } 
       } 
     /* the socket for this accepted connection is rqst */ 
    } 
} 
+0

不要绑定一个IP:端口组合,而不是一个IP? netstat不会将端口1234显示为绑定到任何进程。 – ffledgling 2013-03-18 22:25:28

回答

7

inet_addr已经返回地址在网络顺序的功能:

的inet_addr()函数的互联网主机地址CP从 IPv4的转换数字和将点符号转换为二进制数据按网络字节顺序排列

请删除htonl

+0

我看到noob错误。感谢您的快速回复! 当SO解除10min冷却时间后,我会接受答案! – ffledgling 2013-03-18 22:28:18

+2

@Ayos:不,不是一个noob错误。你根本没有仔细阅读文档。 – alk 2013-03-19 08:02:37

+0

@alk正式注意。 :) – ffledgling 2013-03-19 08:20:18

相关问题