Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> WinSock connect() ошибка таймаута 1006, В локале работает, а по сети - нет. 
V
    Опции темы
mortalis1
Дата 19.2.2010, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 19.2.2010

Репутация: нет
Всего: нет



Народ, когда я подключаюсь к localhost, у меня всё работает, а когда пробую по сети - ошибка "таймаут" коннекта. Сеть работает. Через консоль putty вместо клиента тоже не работает, следовательно ошибка должна быть в серверной части. Вот часть сервера:
Код

   // Шаг 3 - связывание сокета с локальным адресом
    sockaddr_in local_addr;
    local_addr.sin_family = AF_INET;
    local_addr.sin_port = htons(MY_PORT); 
    local_addr.sin_addr.s_addr = 0; // сервер принимает подключения
                                    // на все свои IP-адреса

    // вызываем bind для связывания
    if (bind(my_socket, (sockaddr *)&local_addr, sizeof(local_addr)))
    {
    addLogMessage("Error bind");
    addLogMessageInt(WSAGetLastError());
        closesocket(my_socket); 
        WSACleanup();
        return -1;
    }
    addLogMessage("TCP SERVER BindSock");

 // Шаг 4 - ожидание подключений. Размер очереди - 0x100
    if (listen(my_socket, 0x100))
    {  
    addLogMessage("Error listen");
    addLogMessageInt(WSAGetLastError());
        closesocket(my_socket);
        WSACleanup();
        return -1;
    }
    addLogMessage("WAIT CONNECT");

//======== вызывается в цикле =======================

int sockListIteration(void){
    // Шаг 5 - извлекаем сообщение из очереди
    SOCKET client_socket; // сокет для клиента
    sockaddr_in client_addr; // адрес клиента 
    int client_addr_size = sizeof(client_addr);
    int err;

    fd_set read_fds;
    FD_ZERO(&read_fds);
    FD_SET(my_socket,&read_fds);

    struct timeval timeout;
    timeout.tv_sec = 1;
    //timeout.tv_usec = 100000; // 100 mc
    
    addLogMessage("select()");

    int ret = select(my_socket, &read_fds, 0, 0, &timeout);
    if(ret==-1)
    {
        if(errno == WSAEINTR)
        {
            // вызов select прерван сигналом. Попытаемся вызвать еще раз    
            addLogMessage("if(errno == WSAEINTR)");
            return 0;
        }
        addLogMessage("произошла ошибка при выполнении select");
        return -1;
    }
    if (ret==0){
        // таймаут. За указанное время никаких событий не произошло.
        addLogMessage("if (ret==0)");
        return 0;
    }
    addLogMessage("if (ret>0)");
    client_socket = accept(my_socket, (sockaddr *)&client_addr,&client_addr_size);

    err = WSAGetLastError();
    if (err == WSAEWOULDBLOCK) return 0;
    if (err == 183) return 0;
    if (client_socket < 0)
    {
        addLogMessageInt(err);
        addLogMessage("Error accept");
        return -1;
    }
    addLogMessageInt((int)(client_socket));
    nclients++; // увеличиваем счетчик подключившихся клиентов

    HOSTENT *hst; // пытаемся получить имя хоста
    hst = gethostbyaddr((char *)&client_addr. sin_addr.s_addr, 4, AF_INET);

    // вывод сведений о клиенте
    char buf[1024];
    sprintf(buf, "+%s [%s] new connect!",(hst) ? hst->h_name : "", inet_ntoa(client_addr.sin_addr));
    addLogMessage(buf);
    PRINTNUSERS 

    // Вызов нового потока для обслуживания клиента

    DWORD thID;
    SOCKET *psocket = new SOCKET[1];  // создаем ячейку памяти для дескриптора сокета,
    *psocket = client_socket;         // чтобы client_socket не затирался
    CreateThread(NULL, NULL, SexToClient, (void*)(psocket), NULL, &thID);
    //  CreateThread(NULL, NULL, SexToClient, &client_socket, NULL, &thID);
    return 0;
}



Если сокет блокирующий, без select, то та же беда: в локале обмен сообщениями идет, а по сети - нет  smile

Добавлено через 5 минут и 59 секунд
Антивирусы и файерволы у меня выключены

Добавлено через 9 минут и 22 секунды
ip правильные, порты одинаковые. 
PM MAIL   Вверх
SVN74
Дата 19.2.2010, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 5.5.2008
Где: Комсомольск на Дн епре

Репутация: 1
Всего: 18



Цитата(mortalis1 @  19.2.2010,  19:31 Найти цитируемый пост)
DWORD thID;
    SOCKET *psocket = new SOCKET[1];  // создаем ячейку памяти для дескриптора сокета,
    *psocket = client_socket;         // чтобы client_socket не затирался
    CreateThread(NULL, NULL, SexToClient, (void*)(psocket), NULL, &thID);

Нет необходимости создавать "ячейку" для дескриптора сокета, - надо просто в новом потоке создать новый SOCKET и передать ему сокет по указателю.
И зачем для не блокирующего сокета вообще использовать отдельный поток.
Может просто использовать блокирующий сокет с таймаутом.
========================
Код

void SetSockTimeWait(SOCKET inSock, int TimeWait)
 {
       int t = TimeWait;
       setsockopt(inSock, SOL_SOCKET, SO_RCVTIMEO, (char*) &t, sizeof(t));
 }

========================


Это сообщение отредактировал(а) Олег2005 - 22.2.2010, 13:13
PM MAIL WWW   Вверх
mortalis1
Дата 19.2.2010, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 19.2.2010

Репутация: нет
Всего: нет



В любом случае проблема раньше - в логах таймаут select'a
Код

    if (ret==0){
        // таймаут. За указанное время никаких событий не произошло.
        addLogMessage("if (ret==0)");
        return 0;
    }

Да и в локале это работает.
PM MAIL   Вверх
SVN74
Дата 19.2.2010, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 5.5.2008
Где: Комсомольск на Дн епре

Репутация: 1
Всего: 18



Цитата(mortalis1 @  19.2.2010,  19:31 Найти цитируемый пост)
Если сокет блокирующий, без select, то та же беда: в локале обмен сообщениями идет, а по сети - нет

Может причина в FireWall или в NAT ?  С этим все в порядке?
PM MAIL WWW   Вверх
mortalis1
Дата 19.2.2010, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 19.2.2010

Репутация: нет
Всего: нет



Цитата(mortalis1 @  19.2.2010,  19:31 Найти цитируемый пост)
Антивирусы и файерволы у меня выключены

И не NAT. smile 
PM MAIL   Вверх
SVN74
Дата 19.2.2010, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 5.5.2008
Где: Комсомольск на Дн епре

Репутация: 1
Всего: 18



Цитата(mortalis1 @  19.2.2010,  21:49 Найти цитируемый пост)
И не NAT

Ну а другими (сервером и клиентом) пробовали, работает?
PM MAIL WWW   Вверх
mortalis1
Дата 19.2.2010, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 19.2.2010

Репутация: нет
Всего: нет



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

Добавлено через 43 секунды
И работает только если на одной машине и клиент, и сервер
PM MAIL   Вверх
mortalis1
Дата 20.2.2010, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 19.2.2010

Репутация: нет
Всего: нет



После более детального тестирования выяснилось, что в обычном приложении всё работает, а в СЕРВИСЕ - нет. А мне нужен именно СЕРВИС.
PM MAIL   Вверх
mortalis1
Дата 20.2.2010, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 19.2.2010

Репутация: нет
Всего: нет



Отбой! SVN74, спасибо. Просто был рандомный глюк.  smile 

Это сообщение отредактировал(а) mortalis1 - 20.2.2010, 19:44
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0475 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.