UDP server
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.123] |
|
|
Соблюдайте общие правила форума
MSDN Library
FAQ раздела
Поиск по разделу
Как правильно задавать вопросы| Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
UDP server
|
|
|
|
|
добрый день.
не сталкивался с UDP и возник вопрос. в TCP после открытия порта - он занимается. а в UDP так же? пробывал поднять сервер по примеру как тут http://www.ithowto.ru/66-primer-raboty-s-k...udp-server.html на Indy - не случается событие IdUDPServer1UDPRead посылаю пакет широковещательно при помощи утилиты скаченной из интернета. не ясно что делаю не верно http://joxi.ru/v29J6NDcZnKQAG |
|
Сообщ.
#2
,
|
|
|
|
У вас порт привязан к IP адресу. Т.е он фильтрует по нему запросы.
Что-бы принимать все пакеты надо ставить 0.0.0.0 Во-вторых смотрите снифиром, что куда идёт. А то в последних виндах широковещательную рассылку сделали "привилегированной" операцией. |
|
Сообщ.
#3
,
|
|
|
|
спасибо за подсказку. попробую
сторонее приложение которым я отправляю - точно вешает широковещательный пакет. на ардуинке принимаю его и в ответ отправляю хотел заменить чужое приложение своим на Delphi - самостоятельно общаться по UDP с своей ардуинкой. пока пытаюсь вещать широковещательно пакет чужим приложением и на этом же компьютере принимать его. интересно что в Delphi есть IdUdpServer и UDPServer два компонента. |
|
Сообщ.
#4
,
|
|
|
|
нет. видимо все равно что то не так делаю
отправляю пакеты но они не доходят до приложения на дельфи http://joxi.ru/LmG31j4cwO0Vml |
|
Сообщ.
#5
,
|
|
|
|
нашел пример отправки.
http://www.sources.ru/delphi/internet/send...dp_packet.shtml во первых Target.sin_addr.S_addr:=INADDR_BROADCAST; говорит что превышены пределы ну ок. заменил на это и все равно не отправляется UDP: ![]() ![]() procedure sendUDP(sUDPPacket:string); var Init:TWSAData; SockOpt:BOOL; Sock:TSocket; Target:TSockAddrIn; Buffer: array[0..2047] of byte; h:integer; begin WSAStartup($101,Init); Sock:=Socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP); SockOpt:=TRUE; SetSockOpt(Sock,SOL_SOCKET,SO_BROADCAST,PansiChar(@SockOpt),SizeOf(SockOpt)) ; Target.sin_port:=htons(51234);//номер порта Target.sin_addr.S_addr:=inet_addr(Pansichar(ChatForm.EditSendAddr.Text));; Target.sa_family:=AF_INET; h:=0; while h<=length(sUDPPacket)-1 do begin Buffer[h]:=ord(sUDPPacket[h+1]); inc(h); end; SendTo(Sock,Buffer[0],length(sUDPPacket),0,Target,SizeOf(Target)); WSACleanup; end; |
|
Сообщ.
#6
,
|
|
|
|
закрыто.
скачал пример отсюда http://cybern.ru/udp-delphi.html изменил его как мне нужно. удобный Untit UDP |
|
Сообщ.
#7
,
|
|
|
|
и все таки почему компонент IdUDPServer1 не работает.
я бы хотел в потоках работать и создать там IdUDPServer1 и получать с него данные. из того что я привел пример выше - в потоке не получится как я понял. т.к. при повторном обращении к UDP.pas старый сокет будет изменен. он там получается как бы общий. |
|
Сообщ.
#8
,
|
|
|
|
непросредственно idUDPClient работает
|
|
Сообщ.
#9
,
|
|
|
|
Emmys
У меня был такой код: Сервер: ![]() ![]() procedure TForm1.FormCreate(Sender: TObject); begin UDPServer.Bindings.Add.Port:=666; UDPServer.Active:=True; end; procedure TForm1.UDPServerUDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle); var sl:TStringList; Msg:string; begin sl:=TStringList.Create; sl.LoadFromStream(AData); Msg:=sl.Text; Delete(Msg,Length(Msg)-1,2); if Msg='ClientConnect' then ShowMessage('Fuck'); sl.Free; end; Клиент: ![]() ![]() procedure TForm1.FormCreate(Sender: TObject); begin UDPClient.Send('255.255.255.255',666,'ClientConnect'); end; |
|
Сообщ.
#10
,
|
|
|
|
когда я двойным кликом формирую то получаю вот это - отличается от вашего
![]() ![]() procedure IdUDPServer1UDPRead(AThread: TIdUDPListenerThread; AData: TArray<System.Byte>; ABinding: TIdSocketHandle); обратите внимание я еще косяк получаю ![]() ![]() TArray<System.Byte> ![]() ![]() TBytes может в этом причина? Добавлено мне очень нужно это реализовать. все встало из за этого сервера |
|
Сообщ.
#11
,
|
|
|
|
Emmys
Это было на 7 delphi, попробуйте не инди компонентами реализовать. |
|
Сообщ.
#12
,
|
|
|
|
^D^ima, у меня знаний не хватает как это сделать в потоке. мне нужно именно в потоке. по этому хотел через Create именно этим компонентом
я нашел рабочий пример на winsock но как его сделать в потоке - не имею понятия |
|
Сообщ.
#13
,
|
|
|
|
Цитата Emmys @ ^D^ima, у меня знаний не хватает как это сделать в потоке. Всё точно так же. 1. Создаём сокет. 2. Делаем Bind 3. Используем select, для получения статуса сокета и последующего его чтения. 4. При чтении данных заполняется структура sockaddr_in, откуда получим IP и порт отправителя. Туда будем отправлять ответ. |
|
Сообщ.
#14
,
|
|
|
|
ЫукпШ. я установил другую версию дельфи там все ок - работает
но я использую сторонние компоненты поэтому хотелось бы именно в этой версии все реализовать выходом из положения вижу удаление индии и установка актуальной не могли бы вы помочь как это сделать. ставлю на дельфи XE |
|
Сообщ.
#15
,
|
|
|
|
http://joxi.ru/v29J6NDcZMEbAG
не могу победить. удаляю файл. нажимаю Install и получаю это |