Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 12.11.2013, 18:41
Shaft Shaft вне форума
Новичок
 
Регистрация: 15.05.2013
Сообщения: 74
Версия Delphi: 7/10.4
Репутация: 12
Вопрос Подскажите пожалуйста небольшой пример с TStringList

Здравствуйте!
Такая проблема:
Нужно разбить строку и записать ее в пять переменных
Приблизительно так:

Строка например:
192.168.1.101:27015

Например объявлены пять переменных
(octetIP1 octetIP2 octetIP3 octetIP4 Port)
и строку надо записать следующим образом что бы:
octetIP1 = 192
octetIP2 = 168
octetIP3 = 1
octetIP4 = 101
Port = 27015

Перекопал много инфы и ничего не нашел. Проблема в том что IPадрес будет всегда разный и за ранее мне не известен.

Подскажите пожалуйста как можно решить задачу?
Ответить с цитированием
  #2  
Старый 12.11.2013, 19:04
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

1) Регекспы.
2) Pos, PosEx, Copy. Ищем первую точку, копируем все до нее, делаем StrToInt, затем ищем следующую точку, и т.д.
3) В лоб:
Код:
var data:array[0..4] of integer;
...
j := 0;
for i := 0 to 4 do
    data[i] := 0;
for i := 1 to length(str) do
begin
    if (str[i] >= '0') and (str[i] <= '9')
        data[j] := data[j] * 10 + ord(str[i]) - 48;
    else if (str[i] = '.') or (str[i] = ':')
    begin
        j := j + 1;
        if (j > 4)
            break;  // или сообщение об ошибке
    end;
    else
       break; // или сообщение об ошибке
end;
Тут как побочный эффект будут также парситься например 192:168:1:101.27015.
Первые 4 элемента массива будут IP, пятый - порт.
З.Ы. Кстати, если это связано с предыдущим постом - зачем сначала все собирать в строку, а потом парсить назад в числа?
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 12.11.2013 в 19:13.
Ответить с цитированием
Этот пользователь сказал Спасибо Bargest за это полезное сообщение:
Shaft (12.11.2013)
  #3  
Старый 12.11.2013, 19:06
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Неужели действительно "ничего не нашёл"?
Код:
var
  ip: string;
  octetIP1, octetIP2, octetIP3, octetIP4, Port: Integer;
begin
  ip := '192.168.1.101:27015';
  octetIP1 := StrToInt(copy(ip,1,pos('.',ip)-1));
  delete(ip,1,pos('.',ip));
  octetIP2 := StrToInt(copy(ip,1,pos('.',ip)-1));
  delete(ip,1,pos('.',ip));
  octetIP3 := StrToInt(copy(ip,1,pos('.',ip)-1));
  delete(ip,1,pos('.',ip));
  octetIP4 := StrToInt(copy(ip,1,pos('.',ip)-1));
  delete(ip,1,pos('.',ip));
  Port := StrToInt(ip);
end;
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj

Последний раз редактировалось PhoeniX, 12.11.2013 в 19:12.
Ответить с цитированием
Этот пользователь сказал Спасибо PhoeniX за это полезное сообщение:
Shaft (12.11.2013)
  #4  
Старый 12.11.2013, 19:11
Shaft Shaft вне форума
Новичок
 
Регистрация: 15.05.2013
Сообщения: 74
Версия Delphi: 7/10.4
Репутация: 12
По умолчанию

Спасибо! а если не сложно можно не большой примерчик пжл?

P.S. Я создаю свой Master Server, в предыдущей теме я пытался имитировать клиент игры и отправлял запросы на Официальный Master, мне нужно было принять ответ и полностью расшифровать его, что бы я потом мог сам отправлять эти ответы в правильном виде.
Ответить с цитированием
  #5  
Старый 12.11.2013, 19:12
Shaft Shaft вне форума
Новичок
 
Регистрация: 15.05.2013
Сообщения: 74
Версия Delphi: 7/10.4
Репутация: 12
По умолчанию

Ну не то что бы совсем ничего, для моего случая не могу найти(
Спасибо! Буду пробовать
Ответить с цитированием
  #6  
Старый 12.11.2013, 19:21
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Цитата:
Сообщение от Shaft
Ну не то что бы совсем ничего, для моего случая не могу найти(
Привыкай к тому, что "для твоего случая" никогда и ничего найти не получится. Ты должен сам уметь строить необходимый алгоритм из мелких частей.
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #7  
Старый 12.11.2013, 19:33
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
P.S. Я создаю свой Master Server, в предыдущей теме я пытался имитировать клиент игры и отправлял запросы на Официальный Master, мне нужно было принять ответ и полностью расшифровать его, что бы я потом мог сам отправлять эти ответы в правильном виде.
Я тоже делал свой мастер-сервер. Только не для valve-игр, а для другой. Но структура такая же. И я ума не приложу, зачем парсить строку. Мастер-сервер принимает сообщения вида "создан сервер тут на таком-то порту" от создаваемых серверов, в бинарном виде. Добавляет в свою таблицу IP и порт и рассылает всем клиентам по запросу этот список (что и было сделано тобой в прошлой теме).
Вот где тут парсинг строки?
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #8  
Старый 12.11.2013, 19:35
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Кстати да. Первый вопрос надо задавать не "как?" на форуме, а "нафига?" самому себе
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #9  
Старый 12.11.2013, 19:46
Shaft Shaft вне форума
Новичок
 
Регистрация: 15.05.2013
Сообщения: 74
Версия Delphi: 7/10.4
Репутация: 12
По умолчанию

У них там алгоритм какой то замудренный, даже я со своими знаниями сделал бы намного проще.

У них обязательный формат ответа: начало FF FF FF FF 66 0A
потом
First octet of IP address
Second octet of IP address
Third octet of IP address
Fourth octet of IP address
Port number

https://developer.valvesoftware.com/...Query_Protocol

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

P.S. Valve последним патчем почти все переделали, теперь серверы не могут сами добавляться в мастер сервер, инфа на сайте старая, фактически немного не так, даже звуковой кодек для связи по микрофону поменяли.

Последний раз редактировалось Shaft, 12.11.2013 в 19:48.
Ответить с цитированием
  #10  
Старый 12.11.2013, 19:53
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

То-есть парсинг - для чтения списка из файлов? Ну, тогда понятно. Хотя всё равно не ясно, как эти сервера туда будут добавляться. Если автоматически или другой программой - то проще и правильнее использовать типизированные файлы. Если вручную - то оправдано.
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #11  
Старый 12.11.2013, 19:57
Shaft Shaft вне форума
Новичок
 
Регистрация: 15.05.2013
Сообщения: 74
Версия Delphi: 7/10.4
Репутация: 12
По умолчанию

Я хочу в TStringList добавлять из файла все серверы которые в нем записаны в столбик в формате IP:PORT

Этот IP:PORT обязательно разобрать на части
пробовал отправить в строчку IP:PORT но игра меня посылает в "лес"
Принимает только по частям
P.S. серверы после последнего патча добавляются только в ручную администратором мастер-серверов

Последний раз редактировалось Shaft, 12.11.2013 в 20:07.
Ответить с цитированием
  #12  
Старый 12.11.2013, 20:44
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
Радость

разделить "ip : port" на "ip" и "port" можно через WinHttpCrackUrl. разделить "ip":

Код:
uses
  WinSock,

var
  ip: DWORD;
begin
  ip:=inet_addr('192.168.1.101');
  Memo1.Lines.Add(IntToStr((ip shr 24) and $ff));
  Memo1.Lines.Add(IntToStr((ip shr 16) and $ff));
  Memo1.Lines.Add(IntToStr((ip shr 8) and $ff));
  Memo1.Lines.Add(IntToStr((ip shr 0) and $ff));
end;
__________________
Пишу программы за еду.
__________________

Последний раз редактировалось NumLock, 12.11.2013 в 20:47.
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
Shaft (13.11.2013)
  #13  
Старый 12.11.2013, 20:53
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Простите, не сдержался
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение:
Bargest (13.11.2013)
  #14  
Старый 13.11.2013, 09:01
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
Смех

Код:
uses
  WinSock, WinInet,
...
var
  URL: String;
  lpUrlComponents: TURLComponents;
  lpszHostName: array [0..$1f] of Char;
  dwURL: Integer;
begin
  URL:='192.168.1.101:27015';
  ZeroMemory(@lpUrlComponents, SizeOf(TURLComponents));
  lpUrlComponents.dwStructSize:=SizeOf(TURLComponents);
  lpUrlComponents.lpszHostName:=@lpszHostName[0];
  lpUrlComponents.dwHostNameLength:=Length(lpszHostName);
  if InternetCrackUrl(PChar('http://'+URL), 7+Length(URL), ICU_DECODE, lpUrlComponents) then
  begin
    dwURL:=inet_addr(@lpszHostName[0]);
    if dwURL=INADDR_NONE then RaiseLastOSError;
    // out
    Memo1.Lines.Add(IntToStr((dwURL shr 0) and $ff));
    Memo1.Lines.Add(IntToStr((dwURL shr 8) and $ff));
    Memo1.Lines.Add(IntToStr((dwURL shr 16) and $ff));
    Memo1.Lines.Add(IntToStr((dwURL shr 24) and $ff));
    Memo1.Lines.Add(':');
    Memo1.Lines.Add(IntToStr(lpUrlComponents.nPort));
    // out
  end else RaiseLastOSError;
end;
__________________
Пишу программы за еду.
__________________

Последний раз редактировалось NumLock, 13.11.2013 в 09:04.
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
Shaft (13.11.2013)
  #15  
Старый 13.11.2013, 15:01
Shaft Shaft вне форума
Новичок
 
Регистрация: 15.05.2013
Сообщения: 74
Версия Delphi: 7/10.4
Репутация: 12
По умолчанию

Спасибо ребят! Благодаря вашим примерам проблему решил, все работает.
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 14:33.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025