Проблемы в работе с UDP протоколом
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.217.9] |
|
|
Соблюдайте общие правила форума
MSDN Library
FAQ раздела
Поиск по разделу
Как правильно задавать вопросы
Проблемы в работе с UDP протоколом
|
|
|
|
|
Здравствуйте, уважаемые форумчане!
Недавно у меня возникла потребность в работе с UDP протоколом, но т.к. я нуб-самоучка, но погуглив несколько примеров, так и не понял, как с ним работать. Мне требуется передать определенный массив данных на сервер и получить от него ответ. К сожалению у меня ничего не вышло. Ниже код моих функций ![]() ![]() type TPacket = packed record pack: array [1 .. 15] of byte; end; var Sock: TSocket; ServerAddr: TSockAddrIn; wData: TWSAData; fip:string; const port=7701; procedure SendToIP(fpack: string); procedure Send(var Packet: TPacket; var Addr: TSockAddrIn); begin sendto(Sock, Packet, 12, 0, Addr, SizeOf(Addr)); end; var PacketToSend: TPacket; i: integer; const testpacket:array [1..12] of byte=($53, $41, $4D, $50, $B2, $DA, $D6, $4E, $15, $1E, $69, $53); begin ServerAddr.sin_port := htons(port); ServerAddr.sin_addr.S_addr := inet_addr(PAnsiChar(fip)); // PacketToSend.pack := $00; FillChar(PacketToSend.pack,sizeof(PacketToSend.pack),0); { for i := 0 to length(fpack) - 1 do PacketToSend.pack[i] := Ord(fpack[i + 1]); } lstrcpy(@PacketToSend.pack, @testpacket); Send(PacketToSend, ServerAddr); end; procedure ExecutePacket(pack: TPacket; from: AnsiString); var i:integer; p:string; begin for i:=1 to sizeof(pack.pack) do begin p:=p+IntToHex(pack.pack[i],2)+' '; end; MessageBoxA(0,Pchar(p),PChar(from),0); end; procedure RecvProc(Param: Pointer); stdcall; var Count: LongInt; from: TSockAddrIn; FromLen: LongInt; Packet: TPacket; i, j: LongInt; begin while True do begin FromLen := SizeOf(from); Count := recvfrom(Sock, Packet, SizeOf(Packet), 0, from, FromLen); { if Count > 0 then begin } ExecutePacket(Packet, string(inet_ntoa(from.sin_addr))); end; // end; end; procedure InitUDP; begin WSAStartup($0101, wData); Sock := socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); ServerAddr.sin_family := AF_INET; ServerAddr.sin_port := htons(port); bind(Sock, ServerAddr, SizeOf(ServerAddr)); CreateThread(nil, 0, @RecvProc, nil, 0, LongWord(nil^)); end; procedure DestroyUDP; begin closesocket(Sock); WSACleanup; end; Проблема заключается в том, что при отправке ничего не происходит. Ответа не приходит(судя по всему и отправки тоже). Включив сниффер пакетов и запустив свое приложение, я не увидел, чтобы что либо отправлялось. Будьте любезны, покажите на пальцах работающий пример и объясните пожалуйста в чем у меня ошибки. Заранее огромное спасибо! |
|
Сообщ.
#2
,
|
|
|
|
BugMeNot
Читайте: У. Р. Стивенс. UNIX. Разработка сетевых приложений Джонес_А.,_Оланд_Дж.-Программирование_в_сетях_Microsoft_Windows-Питер(2002) Читать в таком порядке. Добавлено PS. Каждая функция возвращает свой статус. Сделай проверку и вывод описания ошибки. Тогда можно будет легко понять что не работает. |
|
Сообщ.
#3
,
|
|
|
|
Pavia, надеюсь когда у вас возникнет вопрос в какой-либо сфере деятельности и вы обратитесь к специалисту, он порекомендует вам прочитать 800 страничную книгу, где описана схожая с вашей проблема.
|
|
Сообщ.
#4
,
|
|
|
|
Цитата BugMeNot @ но т.к. я нуб-самоучка, но погуглив несколько примеров, так и не понял, как с ним работать. Цитата BugMeNot @ Pavia, надеюсь когда у вас возникнет вопрос в какой-либо сфере деятельности и вы обратитесь к специалисту, он порекомендует вам прочитать 800 страничную книгу, где описана схожая с вашей проблема. BugMeNot, в таком случае почему бы не обратиться к компоненту Indy? Который UDP? И не пытаться понять "внутренности" сокетов? Например так:![]() ![]() IdUDPServer1.SendBuffer(ax,9750,ay[1],2); |
|
Сообщ.
#5
,
|
|
|
|
1. Сделать простейший тестовый пример (отправка 1 байта / прием 1 байта) - без потоков и пакетов. Легче будет ловить глюки.
2. В самом деле проверять результат всех сокет-функций. Это можно легко выполнить, обернув каждый вызов в Win32Check |
|
Сообщ.
#6
,
|
|
|
|
BugMeNot
На лови пример накидал с проверочкой, ток не знаю зачем это тебе хочешь досер негодник написать ))): ![]() ![]() var Form1: TForm1; s:TSocket; WSA:TWSAData; addr:TSockAddr; Buff:array[0..1024] of Char; th1: cardinal; h1: integer; implementation {$R *.dfm} procedure incedit1; begin Buff:= '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$'+#13#10+ '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$'+#13#10+ '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$'+#13#10+ '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$'+#13#10+ '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$'+#13#10+ '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$'+#13#10+ '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$'+#13#10+ '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$'+#13#10+ '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$'+#13#10+ '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$'+#13#10+ '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$'+#13#10+ '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$'+#13#10+ '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$'+#13#10+ '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$'+#13#10+ '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$'+#13#10+ '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$'+#13#10+ '$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$'+#13#10; while 0=0 do begin send(s,Buff,Length(Buff),0); Form1.Memo1.Lines.Add(IntToStr(s)); //проверяем идёт ли отправка наших пакетов Sleep(1); end; end; procedure TForm1.Button1Click(Sender: TObject); begin WSAStartup(MakeWord(2, 0), WSA); s := Socket(PF_INET, SOCK_STREAM, 0); addr.sin_family := AF_INET; addr.sin_port := htons(80); addr.sin_addr.S_addr := inet_addr(PChar('80.247.32.206')); if connect(s, Addr, SizeOf(Addr))= 0 then Form1.Caption:='Connect' else Form1.Caption:='No Connect'; //проверяем законектились или нет, чтоб на указанный IP послать пакеты end; procedure TForm1.Button2Click(Sender: TObject); begin h1 := beginthread(nil, 1024, @incedit1, nil, 0, th1); //чтоб форма не висла запускаем в патоке incedit1 end; end. |
|
Сообщ.
#7
,
|
|
|
|
Не увидел, чему именно равно fip.
Цитата BugMeNot @ Включив сниффер пакетов и запустив свое приложение, я не увидел, чтобы что либо отправлялось. Если пересылка идёт самому себе (между разными портами одного и того же адаптера), то сниффер такой локальный трафик просто не слышит (даже такой хардкорный как WireShark) - но тут можно воткнуть две сетевые карты и соединить их кроссовер-кабелем (или через хаб/маршрутизатор и т.п.). |