Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Технологии программирования > Сетевое программирование
Перезагрузить страницу Простейшие клиент-сервер на сокетах: почему ошибка 10060
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
kolchakA kolchakA вне форума
Новичок
 
Сообщений: 5
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 28.11.2009
По умолчанию 28.11.2009, 02:15

Попытался реализовать простейшие клиент и сервер на сокетах. Оба - клиент и сервер работают на моем компьютере. Сервер открывает соединение для любого ip адреса и ждет подключения, клиенту для подключения при отладке задаю внешний ip адрес своего компа (внешний ip получаю любым онлайн сервисом по определению ip - или просто набираю в яндексе "мой ip"). Но при подключении функция connect около полуминуты ждет, а потом возвращает ошибку: 10060(ошибка соединения с сервером).

На компе установлен Каспер и Outpost (пробовал даже их отключать, все-равно не работает).

Ниже привожу код клиента и сервера.
Клиент:
Код:
WSADATA lpWSAData;
        SOCKET my_sock;
    
    int port_num=3333;
    int errorsock;
    char*buff=new char(512);
    if (WSAStartup(MAKEWORD(1,1),&lpWSAData)!=0)
    { 
        MessageBox(0,"WSAStartup ERROR","ERROR",0);
        return(NULL);
    }

    my_sock=socket(AF_INET, SOCK_STREAM, 0);
        if (my_sock==INVALID_SOCKET) {
        MessageBox(0,"Socket creation ERROR","ERROR",0);
        WSACleanup();
        return(NULL);
        }

       sockaddr_in dest_addr;
       dest_addr.sin_family = AF_INET;
       dest_addr.sin_port = htons(port_num);
       dest_addr.sin_addr.s_addr = inet_addr("94.178.65.158"); //мой ip

    if (connect(my_sock, (sockaddr *)&dest_addr, sizeof(dest_addr)))
       {
                errorsock=WSAGetLastError();
        MessageBox(0,"ERROR connecting","ERROR",0);
        closesocket(my_sock);
        WSACleanup();
                return(NULL);
        }
    
      
    send(my_sock,"Hello",128,0);
    
    closesocket(my_sock);
    WSACleanup();
Сервер:
Код:
WSADATA wsaData;
    WSAStartup(MAKEWORD(2,2), &wsaData); 
        SOCKET listet_Sock = socket(AF_INET,SOCK_STREAM,0); 

    SOCKADDR_IN addr_Sock;

    addr_Sock.sin_family = AF_INET;

    addr_Sock.sin_addr.s_addr = htonl(INADDR_ANY);

    addr_Sock.sin_port = htons(3333); 
    
        if(bind(listet_Sock,(LPSOCKADDR)&addr_Sock, sizeof(struct sockaddr))) return 0; 

    if(listen(listet_Sock, 1)) return 0; 

    
    char type[2], buf[126];

    SOCKET sock = accept(listet_Sock,0,0);

       //Здесь начинается ожидание
Подскажите, в чем проблема?
Ответить с цитированием
  (#2 (permalink)) Старый
Angel5a Angel5a вне форума
Member
 
Сообщений: 1,213
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 28.02.2005
По умолчанию 28.11.2009, 16:29

Используйте специальный адрес 127.0.0.1
в функции accept надо указать размер очереди. ) - меня смущает но могу ошибаться.
И вообде доступен ли сервер. попробуйте подключиться к нему через телнет
Цитата:
telnet 127.0.0.1 3333
Ответить с цитированием
  (#3 (permalink)) Старый
kolchakA kolchakA вне форума
Новичок
 
Сообщений: 5
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 28.11.2009
По умолчанию 01.12.2009, 09:36

Цитата:
Используйте специальный адрес 127.0.0.1
в функции accept надо указать размер очереди. ) - меня смущает но могу ошибаться.
И вообде доступен ли сервер. попробуйте подключиться к нему через телнет
Через 127.0.0.1 все работает.
а в accept нигде не указывается размер очереди (вроде как).
Подсоединиться к серверу telnetом пробовал командой open ip port. При этом получал следующие результаты:
если - open ip , то выводится запрос на ввода логина и пароля для входа в управление модемом (у меня Calisto)
если - open ip 80, то выводится сообдение от micro_httpd сервера 400 Bad Request
если - open ip 3333 (это в поей проге открываемый порт), то тупо ждет, а потом пишет - Не удалось открыть подключение к этому узлу на порт 3333: Сбой подключения.
Ответить с цитированием
  (#4 (permalink)) Старый
Garik Garik вне форума
Member
 
Сообщений: 6,201
Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
Регистрация: 07.06.2002
По умолчанию 01.12.2009, 10:54

А чего ж ты в клиенте проверяешь результат WSAStartup() и socket(), а в сервере - нет?
Может в этом дело?
Ответить с цитированием
  (#5 (permalink)) Старый
Angel5a Angel5a вне форума
Member
 
Сообщений: 1,213
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 28.02.2005
По умолчанию 01.12.2009, 20:35

Сайты типа "Мой IP" отображают ip-адрес под которым ты обратился к ним. Этот адрес тебе выделяет твой провайдер и весь траффик идёт через провайдера. Таким образом когда ты пытаешься обратится к своему компьютеру по внешнему адресу:
- твой запрос с модема передаётся провайдеру (т.к. адрес не локальной сети)
- ты выходишь в интернет через провайдера
- пытаешься из интернета пройти по своему внешнему адресу ***
- провайдер перенаправляет запрос на твой модем ***
- соединение установлено
Вот в отмеченных пунктах и может возникнуть проблема. Или провайдер закрывает внешний доступ к твоему компьютеру в целях безопасности (за исключением "известных" портов) или модем блокирует доступ. Я склоняюсь к первому варианту.

Вообще для отладки сетевого взаимодействия и предусмотрен специальный адрес "127.0.0.1" он же "localhost" ( определён в файле WINDOWS\system32\drivers\etc\hosts ). Считается (да так и есть) что если у тебя работает по этому адресу, то будет работать и в сети, ПРИ условии отсутствуия брендмауеров и фаерволов (в этом случае требуется ещё и их настройка).

Т.к. по локальному адресу всё работает, то ошибка не в коде.
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
kolchakA kolchakA вне форума
Новичок
 
Сообщений: 5
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 28.11.2009
По умолчанию 01.12.2009, 21:39

Цитата:
А чего ж ты в клиенте проверяешь результат WSAStartup() и socket(), а в сервере - нет?
Может в этом дело?
я его в отладчике проганял, все нормал было.
Ответить с цитированием
  (#7 (permalink)) Старый
kolchakA kolchakA вне форума
Новичок
 
Сообщений: 5
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 28.11.2009
По умолчанию 01.12.2009, 21:46

Хороший ответ. Но вот он порождает еще один вопрос (так из любопытства) - как мне наверняка узнать в чем проблема - в провайдере или в модеме? Где посмотреть, какие порты кто закрывает?

Цитата:
Сайты типа "Мой IP" отображают ip-адрес под которым ты обратился к ним. Этот адрес тебе выделяет твой провайдер и весь траффик идёт через провайдера. Таким образом когда ты пытаешься обратится к своему компьютеру по внешнему адресу:
- твой запрос с модема передаётся провайдеру (т.к. адрес не локальной сети)
- ты выходишь в интернет через провайдера
- пытаешься из интернета пройти по своему внешнему адресу ***
- провайдер перенаправляет запрос на твой модем ***
- соединение установлено
Вот в отмеченных пунктах и может возникнуть проблема. Или провайдер закрывает внешний доступ к твоему компьютеру в целях безопасности (за исключением "известных" портов) или модем блокирует доступ. Я склоняюсь к первому варианту.

Вообще для отладки сетевого взаимодействия и предусмотрен специальный адрес "127.0.0.1" он же "localhost" ( определён в файле WINDOWS\system32\drivers\etc\hosts ). Считается (да так и есть) что если у тебя работает по этому адресу, то будет работать и в сети, ПРИ условии отсутствуия брендмауеров и фаерволов (в этом случае требуется ещё и их настройка).

Т.к. по локальному адресу всё работает, то ошибка не в коде.
Ответить с цитированием
  (#8 (permalink)) Старый
Angel5a Angel5a вне форума
Member
 
Сообщений: 1,213
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 28.02.2005
По умолчанию 01.12.2009, 22:49

Мой компьютер -> Сетевое окружение -> Отобразить сетевые подключения:
На подключение делаешь клик правой кнопкой -> Состояние -> Поддержка (вкладка)
Там есть ip адрес который выделен для этого подключения. То есть для модема ты получишь адрес модема. пытаешься обратиться по этому адресу.
Если всё ок, то рубит провайдер - эта проблема не разрешима.
Если неудачно, надо лезть в настройки и мануал модема в поисках что же запрещено.
Приблизительно так.

Узнать какие порты у тебя открыты можно с помощью сканеров портов PortMon и т.п. Узнать какие сетевые соединения у тебя активны можно с помощью Tcpview (будет так же отображать твой сервер если он запущен). Программы можешь погуглить, их полно.
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа клиент-сервер mraskc Задания за деньги 7 16.02.2012 09:21
Как написать клиент-сервер на qt vil666 Вопросы начинающих программистов 0 11.06.2011 17:05
Простой клиент-сервер на C# tigerx2 .NET 5 21.09.2010 00:53
Простейший клиент-сервер Blax Delphi 1 02.03.2009 06:43
Клиент-сервер+функции... James007Bond Задания за деньги 1 10.04.2008 11:08
Клиент-сервер приложение monday С/С++ 2 08.04.2008 21:46
клиент-сервер с исп. bluetooth kalashnikof Работа 0 11.10.2007 22:21
Клиент сервер как создать MAcK1 Сетевое программирование 3 26.09.2007 11:07
Сервер клиент и классы Gansss C++ Builder 3 02.01.2007 06:31
DHCP сервер на C++ в Buileder6 на Indy или на сокетах MC_PULP Сетевое программирование 0 17.06.2006 16:25
Клиент-сервер программирование Texel .NET 0 25.03.2004 17:48
С++ билдер клиент и сервер toshkaexe .NET 0 01.01.1970 04:00



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов