C - Почему я не могу получить доступ к своему серверу извне localhost? - PullRequest
4 голосов
/ 19 октября 2011

В последнее время я работаю с программированием сокетов; и в настоящее время я делаю сервер, который прослушивает порт для входящих соединений, затем, как только он его получает, читает в строку и помещает его в файл.

Все работает нормально, когда я подключаюсь к запущенному серверу с локального хоста, но когда я пытаюсь получить к нему доступ из любого другого места, он действует так, как будто его не существует. Nmap не показывает этот конкретный открытый порт - ни с локального, ни с удаленного хоста. только работает через telnet на localhost.

Код функции здесь . (Pastebin) Я знаю, что это беспорядок, я все еще довольно незнаком с сетевым программированием. На самом деле не существует хороших подробных уроков, которые показывают вам все, что вам нужно знать. Я думаю, мне придется купить книгу ...

Ответы [ 3 ]

2 голосов
/ 19 октября 2011

Ваш код звонит

    if(bind(*sock, b->ai_addr, b->ai_addrlen) == -1) {

, где b основано на результате вызова getaddrinfo. Это, вероятно, не содержит именно то, что вы хотите. Похоже, что cliaddr уже содержит правильные данные для передачи bind(), поэтому используйте вместо этого:

    if (bind(*sock, (struct sockaddr *)&cliaddr, sizeof(cliaddr)) {

Я не уверен, что getaddrinfo() может вернуть вам, но из вашего описания звучит так, как будто он предоставляет адрес 127.0.0.1 (который является localhost). Если вы bind() используете только интерфейс localhost, то это единственный адрес, который будет отвечать на запрос на подключение. Если вы связываетесь с INADDR_ANY, то все интерфейсы будут отвечать на запросы на подключение.

Для простой программы прослушивания через сокет вам, вероятно, вообще не нужен вызов getaddrinfo().

2 голосов
/ 19 октября 2011

Я предполагаю, что ваш порт заблокирован брандмауэром.Попробуйте подключиться к серверу через порт 22580 и посмотреть, отвечает ли он.Если это так, то существует проблема между сервером и вашим кодом.Я предполагаю, что это произойдет по истечении времени ожидания и не даст ответа, поэтому проблема заключается в том, что между вашим сервером и сетью.

Большинство сетей блокирует большинство портов, открывая только порт 80, 443, 25, 8080 и несколько других.

telnet server.ip.address 22580

и посмотрите, подключится ли он.

0 голосов
/ 19 октября 2011

Может потребоваться дополнительная информация, так как существует множество возможных причин для этого сбоя. При доступе (и nmapping) из Интернета вам может понадобиться «пробить дыру» в конфигурации брандмауэра, чтобы разрешить доступ. В противном случае такие инструменты, как «netstat» и «tcpdump» на хосте слушателя, могут предоставить более полезную информацию.

...