2013-03-18 106 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

相關問題