2013-03-18 4 views
3

Я пытаюсь написать программу на языке C, которая прослушивает порт на моей машине. У меня странная ошибка.bind failed: Не удается назначить запрошенный адрес

Всякий раз, когда я пытаюсь связать сокет с фиксированным 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: port, а не просто ip? netstat не показывает порт 1234 как связанный с любым процессом. – ffledgling

ответ

7

Функция inet_addr возвращает адрес уже в сетевом порядке:

inet_addr() функция преобразует интернет-адрес хоста ф из IPv4 номеров, и -dots в двоичные данные в сетевом порядке по байтам

Итак, оставьте htonl.

+0

Я вижу ошибку в ошибке. Спасибо за быстрый ответ! Я согласен с ответом, когда SO поднимает 10-минутный период охлаждения! – ffledgling

+2

@Ayos: Нет, не ошибка noob. Вы просто недостаточно читали документацию. – alk

+0

@alk. :) – ffledgling

Смежные вопросы