Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > сокет, коннект, еррор 10061


Автор: Cashey 6.5.2008, 12:34
пытаюсь послать сообщение через сокет. делаю так:
Код

    WSAStartup($101,Data);
    Soc:=Socket(AF_Inet,Sock_Stream,0);
    if (Soc = INVALID_SOCKET) then begin
      showmessage('Socket() failed: '+IntToStr(WSAGetLastError));
      exit;
    end;
    Addr.sin_family:=PF_Inet;
    Addr.sin_port:=HToNS(5050);
    Addr.sin_addr.S_addr:= inet_addr('xxx.xxx.xxx.xxx'); //('127.0.0.1');
    FillChar(Addr.Sin_Zero,SizeOf(Addr.Sin_Zero),0);
    Len:=SizeOf(TSockAddr);
    if connect(Soc,Addr,Len) <> 0 then begin
      cErr := WSAGetLastError;
      showmessage(inttostr(cErr))  ;
    end;

если  Addr.sin_addr.S_addr присваивается значение '127.0.0.1', то работает, но если подставляю всесто него IP адрес машины в локальной сети, то и при запуске на этой машине, и при запуске с другой возвращается ошибка 10061.

пытался сделать по другому:
Код

  ClientSocket1.Host := '127.0.0.1';
  ClientSocket1.Port := 5050;
  ClientSocket1.Open;

та же самая ошибка, но уже и с локальным IP.
Используется Delphi 6.
Ну и логичный вопрос - что делать?

Автор: ama_kid 6.5.2008, 13:13
Cashey, если ты имеешь ввиду то, о чем мы вчера разговаривали - то я тут сообразил щас, что в контексте той задачи, которую ты описывал, ситуация должна быть немного иной: "серверный" сокет должен поднимать клиент, а сервер - должен открывать соединение и подсоединяться к нему (т.е. наоборот по отношению к тому, как я тебе показывал пример).  Попробуй сделать так, если что - я через пару часов освобожусь и попробую помочь...

Автор: Cashey 6.5.2008, 13:32
ama_kid, да, это как раз развитие вчерашней темы.
твой вчерашний пример работает на одной машине, но если серверную часть перенести на другой комп и поменять IP адрес, то вылетает ошибка 10061. или даже если на одной машине смотреть, то все равно если IP не локальный, а сетевой то выдает ошибку.

Автор: Cashey 6.5.2008, 14:00
я так понимаю.... та часть, что стоит у клиента должна опрашивать свой локальный порт, т.е. для нее будет верно 
Код

    Addr.sin_port:=HToNS(5050);
    Addr.sin_addr.S_addr:=inet_addr('127.0.0.1');

а вот та часть, которая должна послать сообщение клиентской должна стучатся по ее сетевому адресу, т.е. как я и написал
Код
    
    Addr.sin_port:=HToNS(5050);
    Addr.sin_addr.S_addr:= inet_addr('xxx.xxx.xxx.xxx');

а дальше я так понял надо поменять местами

Bind() и Listen() с connect() так?

Автор: ama_kid 6.5.2008, 14:12
Cashey, тьфу, я уже загнался smile У меня ремонт дома, так что иногда могу нести пургу, извиняй... smile
В общем, щас посмотрел, что я тебе вчера написал в том примере - оказывается все правильно. Ключевой момент в том, что клиент - должен сажаться на свой собственный реальный IP-адрес (не 127.0.0.1, а тот, который имеет в сети). А сервер должен на этот адрес слать данные... Только что проверил у себя на виртуальной машине - все заработало...

Автор: Cashey 6.5.2008, 14:58
Цитата(ama_kid @  6.5.2008,  15:12 Найти цитируемый пост)
клиент - должен сажаться на свой собственный реальный IP-адрес (не 127.0.0.1, а тот, который имеет в сети). А сервер должен на этот адрес слать данные

вроде разобрался. я с самого начало так и сделал. но так как я поместил серверную часть на машину не в домене, то она отказывалась соединятся до авторизации. а проверять на ошибку я стал уже после того, как вернул на клиенте IP локальный и тогда он мне возвращал ошибку 10061. сейчас проверил после авторизации и все заработало. уря smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)