LINUX.ORG.RU

Зависает socket


0

1

всем привет, ситуация у меня такая: при вызове функции connect зависает программа, собсна в программе ничё хитрого нет она стучится до яндекс серверf по 13 порту и ip 77.88.21.11 и по идее принимает некоторую строку, но это уже не важно так как зависает на вызове функции connect. Я искал в инете чтото подобное и как я понял проблема в том что у меня стоит роутер. Вопрос такой, в чём именно проблема? Если в роутере то как не изменяя программу настроить роутер( так как я думаю программа не должна зависить от способа организации сети на таком уровне ), а если надо изменять программу то что именно изменять. Вот листинг( с помощью выводу единичек я понял что проблема в коннекте :) ):

#include <iostream>
#include "unp.h"
#include "error.h"

using namespace std;

int main(int argc, char **argv)
{
    int sockfd, n;
    char recvline[MAXLINE+1];
    struct sockaddr_in servaddr;

    if(argc!=2)
        err_quit("usage: a.out <IPaddress>");

    if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 )
        err_sys("socket error");

    cout << 1 << endl;

    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(13);
    if(inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)
        err_quit("inet_pton error for %s", argv[1]);

    cout << 1 << endl;

    if(connect(sockfd, (SA *) &servaddr, sizeof(servaddr)) < 0)
        err_sys("connect error");

    cout << 1 << endl;

    while( (n = read(sockfd, recvline, MAXLINE)) > 0)
    {
        recvline[n] = 0;
        if(fputs(recvline, stdout) == EOF)
            err_sys("fputs error");
        cout << 1 << recvline << endl;
    }
    if(n<0)
        err_sys("read error");
    cout << recvline << endl;
    return 0;
}

P.S. Пример сделан из учебника У. Р. Стивенс - UNIX. Разработка сетевых приложений, 3-е изд. - 2007


If the connection cannot be established immediately and O_NONBLOCK is not set for the file descriptor for the socket, connect() shall block for up to an unspecified timeout interval until the connection is established


Не?

Gvidon ★★★★
()

попробуй telnet 77.88.21.11 13

anonymous
()
Ответ на: комментарий от Gvidon

возможно я не точно написал. Проблема не в том что зависает а в том что зависает при попытке соединения со 100% рабочим сервером.

Onito
() автор топика

зависает на вызове функции connect

Вопрос такой, в чём именно проблема?

Обычно, если пытаешься соединиться с сервером по порту, на котором ничего не висит, отлуп получаешь почти сразу, так как сервер присылает RST (или FIN, я подробностей не знаю) в ответ. Но если администратор сервера настроил выбрасывание всех левых пакетов, сервер не ответит ничего. Поэтому connect подвисает, ожидая SYN-ACK, пока не отвалится по таймауту.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

ну вот например 74.125.143.94 (ip гугла) и порт 80 должен что-то возвращать? если в браузер вбить такой то открывается страница гугла.

Onito
() автор топика
Ответ на: комментарий от i-rinat

правда я не уверен в зависимости от протокола и всё такое :)

Onito
() автор топика
Ответ на: комментарий от i-rinat

Если знаешь сервер до которого можно достучаться через тцп сокет напиши пжалста ип и порт :)

Onito
() автор топика
Ответ на: комментарий от Onito

ну вот например 74.125.143.94 (ip гугла) и порт 80 должен что-то возвращать?

Твой код в этом случае повиснет на read(), так как в HTTP клиент сначала должен прислать запрос, а уже потом слушать ответ.

i-rinat ★★★★★
()
Ответ на: комментарий от Onito
$ echo hello | nc -l -p 4000 &
[1] 32769
$
$
$ telnet 127.0.0.1 4000
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
hello
Connection closed by foreign host.
[1]+  Done                    echo hello | nc -l -p 4000
$
i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

если ты предлагаешь локалхост то не вариант, ошибка из за того что сокет не локальный socket(AF_INET, SOCK_STREAM, 0)

Onito
() автор топика
Ответ на: комментарий от Onito

дык он тебе и не предлагает AF_UNIX. локалхост это не только ценный мех ...

anonymous
()
Ответ на: комментарий от Onito

ты спросил на чём протестировать рабочий вариант. тебе ответили про неткет всё правильно. сделай себе локальный слушающий сокет и тестируй на здоровье.

nanoolinux ★★★★
()
Ответ на: комментарий от Onito

боярин тебе глаголит, что netcat умеет открыть порт и выплюнуть в него что-то. и в учебных случаях вполне себе годен. И не только в учебных...

anonymous
()
Ответ на: комментарий от nanoolinux

Ну как я написал выше я не использую локальный сокет. Я так решил потому что потенциальне проблемы которые могут возникнуть на внешнем сокете не возникнут на локальном. Можешь гарантировать что такое невозможно? если да то вариант, если нет то...

Onito
() автор топика
Ответ на: комментарий от Onito

Ну не используй дальше свой локальный сокет, что ты с ним пристал?

false ★★★★★
()
Ответ на: комментарий от Onito

дропай айпитаблесом все входящий не lo и будет тебе точно такой же таймаут как и на яндексе. Успехов с твоими вариантами.

nanoolinux ★★★★
()
Последнее исправление: nanoolinux (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.