Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.08.2011, 03:22   #1
Anton911
Форумчанин
 
Аватар для Anton911
 
Регистрация: 23.08.2011
Сообщений: 171
Вопрос Работа ServerSocket ClientSocket с внешним ip

Недавно создал клиент серверное приложение на основе ServerSocket и ClientSocket. В локальной сети работает отлично, через интернет тоже работает, если одинаковый провайдер, тоесть ip клиента и ip сервера видны друг другу. Но столкнулся с такой проблемой, поставили сервер программы на внешний ip причем, клиенты видят сервер, но никак не могли коннектиться. После того как начал химичить с компонентами, максимум чего добился это, клиентское приложение пишет что к серверу приконнектился, но на серверном приложении молчек (а должно писать кто приконнектился), вобщем отказывает отправлять и принимать данные. Может быть, ктото уже сталкивался с такой проблемой? Помогите плиз, весь интернет перерыл уже.
Вот код:

Код:
Клиент:

При нажатии на кнопку соединиться:

ClientS.Port:=strtoint(PortEdit.Text);
ClientS.Active:=true;
Connected:=true;
ClientConsole.Lines.Add('['+TimeToStr(Time)+'] Активация...');
ClientConsole.Lines.Add('['+TimeToStr(Time)+'] Канал-> '+ClientS.Address+':'+inttostr(ClientS.Port));

При событии OnConnect:

ClientS.Socket.SendText(UnicodeString(Name+'|'+'Privet|'+Version));


Сервер:

При нажатии на кнопку включить сервер:

ServerS.Port:=strtoint(PortEdit.Text);
ServerS.Active:=true;
ServerConsole.Lines.add('['+TimeToStr(Time)+']'+' Сервер включен');

Событие OnClientConnect:

serverconsole.Lines.Add('['+TimeToStr(Time)+'] '+'Обанаружено соединение: '+Socket.RemoteAddress);

Событие OnClientRead:

SetLength(sss, Socket.ReceiveLength);
SetLength(sss, Socket.ReceiveBuf(Pointer(sss)^, Length(sss)));
len:=Length(sss);
Каждый день узнаю новое...

Последний раз редактировалось Anton911; 23.08.2011 в 06:49.
Anton911 вне форума Ответить с цитированием
Старый 23.08.2011, 09:27   #2
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

А где обработка событий OnError, OnClientError ?
mss вне форума Ответить с цитированием
Старый 23.08.2011, 10:33   #3
Anton911
Форумчанин
 
Аватар для Anton911
 
Регистрация: 23.08.2011
Сообщений: 171
По умолчанию

Цитата:
Сообщение от mss Посмотреть сообщение
А где обработка событий OnError, OnClientError ?
Это все, есть:

Клиент:
Код:
Для события OnError:

ClientConsole.Lines.add('['+TimeToStr(Time)+'] Ошибка. Код = '+IntToStr(ErrorCode));
if (ErrorCode=10061) or (ErrorCode=10051)   then
begin
ClientS.Active:=false;
ClientConsole.Lines.add('['+TimeToStr(Time)+'] Ошибка: Сервер отсутствует.');
end;
if (ErrorCode=10053) then
begin
ClientS.Active:=false;
ClientConsole.Lines.add('['+TimeToStr(Time)+'] Ошибка: Сервер был отключен.');
end;
ClientS.Active:=false;
memo1.Font.Color:=clMaroon;
Сервер:

Событие OnClientError:

Код:
  ServerConsole.Lines.add('['+TimeToStr(Time)+']'+' Ошибка игрока. Код = '+IntToStr(ErrorCode));
Каждый день узнаю новое...
Anton911 вне форума Ответить с цитированием
Старый 23.08.2011, 11:02   #4
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Твой обработчик OnError чреват утечками памяти.
Код:
try
  case ErrorCode of
... здесь анализ кода ошибки , протоколирование и пр.
  end;
finally
  Socket.Close; // Socket - это 2-й формальный параметр метода-обработчика !
  ErrorCode := 0; // можно закомментировать, если не требуется подавление вывода диал.окна сообщения об ошибке
end;
Тоже самое касается и обработки OnClientError на стороне сервера, с той лишь разницей что незакрытие в обработчике ошибки гнезда отказавшего клиентского соединения чревато "мертвыми душами" в списке Connections[] (по сути та же потенциальная утечка ресурсов)
mss вне форума Ответить с цитированием
Старый 23.08.2011, 11:43   #5
Anton911
Форумчанин
 
Аватар для Anton911
 
Регистрация: 23.08.2011
Сообщений: 171
По умолчанию

Цитата:
Сообщение от mss Посмотреть сообщение
Твой обработчик OnError чреват утечками памяти.
Код:
try
  case ErrorCode of
... здесь анализ кода ошибки , протоколирование и пр.
  end;
finally
  Socket.Close; // Socket - это 2-й формальный параметр метода-обработчика !
  ErrorCode := 0; // можно закомментировать, если не требуется подавление вывода диал.окна сообщения об ошибке
end;
Тоже самое касается и обработки OnClientError на стороне сервера, с той лишь разницей что незакрытие в обработчике ошибки гнезда отказавшего клиентского соединения чревато "мертвыми душами" в списке Connections[] (по сути та же потенциальная утечка ресурсов)
Клиент:
Код:
  try
  case ErrorCode of
10061 or 10051:
begin
ClientS.Active:=false; ClientConsole.Lines.add('['+TimeToStr(Time)+'] Ошибка: Сервер отсутствует.');
end;
10053:
begin ClientS.Active:=false; ClientConsole.Lines.add('['+TimeToStr(Time)+'] Ошибка: Сервер был отключен.');
end;
else
begin ClientS.Active:=false;
ClientConsole.Lines.add('['+TimeToStr(Time)+'] Ошибка: '+inttostr(errorCode));
end;
  end;
finally
  clients.Close;
  ErrorCode := 0;
end;
Сервер:

Код:
  try
  ServerConsole.Lines.add('['+TimeToStr(Time)+']'+' Ошибка игрока. Код = '+IntToStr(ErrorCode));
finally
  Socket.Close;
  ErrorCode := 0;
end;
Посмотри пожалуйсто, так лучше?
Каждый день узнаю новое...

Последний раз редактировалось Anton911; 23.08.2011 в 11:48.
Anton911 вне форума Ответить с цитированием
Старый 23.08.2011, 12:50   #6
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
ClientS.Active:=false
Это убери.
mss вне форума Ответить с цитированием
Старый 24.08.2011, 10:11   #7
Anton911
Форумчанин
 
Аватар для Anton911
 
Регистрация: 23.08.2011
Сообщений: 171
По умолчанию

Скажите пожалуйсто, сокетам важно, что клиент и сервер находятся в разных сетях(ip у сервера выделенный)?
Каждый день узнаю новое...
Anton911 вне форума Ответить с цитированием
Старый 24.08.2011, 10:34   #8
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Абсолютно неважно.
mss вне форума Ответить с цитированием
Старый 26.08.2011, 14:04   #9
Anton911
Форумчанин
 
Аватар для Anton911
 
Регистрация: 23.08.2011
Сообщений: 171
По умолчанию

В опциях сокета нужно что-нибудь указывать в Service или оставить его пустым?

И еще:
ip клиента:10.3.6.***
ip сервера: 85.28.202.***
Пробовал пинговать, пинг проходит, 2мс. Коннектюсь к серверу, вроде приконнектился(так пишет в клиентском приложении), вроде данные отсылаются(проверял через фаервол, фаервол не блокирует), но ответ не приходит, и на серверном приложении молчек. В чем может быть проблема? Админы меня заверили что фаервол не блокирует и порт открыт.
Каждый день узнаю новое...

Последний раз редактировалось Anton911; 26.08.2011 в 17:05.
Anton911 вне форума Ответить с цитированием
Старый 26.08.2011, 21:51   #10
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
нужно что-нибудь указывать в Service или оставить его пустым?
Если св-во Port назначено, то не нужно.

Цитата:
В чем может быть проблема?
В ошибках в твоих программах. В 17-й строке.
mss вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с ServerSocket и ClientSocket ***СкаЙ*** Работа с сетью в Delphi 3 22.05.2010 14:09
[TcpClient, TcpServer] или [ServerSocket, ClientSocket] работа через прокси DOLBY Работа с сетью в Delphi 2 17.09.2009 05:46
Работа с ClientSocket и ServerSocket из консоли D_E_N Работа с сетью в Delphi 6 28.07.2009 00:27
Работа с ServerSocket и ClientSocket AlDelta Работа с сетью в Delphi 12 28.09.2008 11:18
Работа с Clientsocket и Serversocket prizrak1390 Работа с сетью в Delphi 3 26.04.2008 22:59