WinPcap - timeoutnál jön csak a csomag

WinPcap - timeoutnál jön csak a csomag
2008-02-26T21:21:18+01:00
2008-02-26T21:44:59+01:00
2022-11-07T18:45:38+01:00
[ Káté
Sziasztok!

Van egy jó kis program/driver, a neve pcap. Ennek használnám a windowsos verzióját, de valahogy nem sikerül rávennem, hogy elküldje a csomagokat nekem érkezésükkel, mert mindig kivárja velük a timeout értékét. WinPCap 4.0.2 van fent.

Itt a kód lényege, ami már nem megy:
p:= pcap_open(PChar(Name),65536,0,0,nil,@errbuf); pcap_next_ex(p,@header,@data);

Na most a Namet az összes példában ugyanúgy bemutatott módon kérem le, azzal nem lehet hiba. (Jah a példák is megvan a hiba, csak az ott nem számít hibának, mert a példa nem erre van kihegyezve).
Az errbuf,header,data is rendben van. A nil pedig csak annyit jelent, hogy nem kell azonosítás.

A kód annyit csinál, hogy kapcsolódik a winpcaphoz, majd a "pcap_next_ex"-re egyből visszatérne az első csomag megkapásakor. Ehelyett nem csinál semmit.

Viszont, ha a timeoutot beállítom 2000re mondjuk, akkor 2mp múlva visszatér az összes eddig kapott csomaggal egyszerre.

p:= pcap_open(PChar(Name),65536,0,2000,nil,@errbuf); pcap_next_ex(p,@header,@data);

Pedig a leírás több helyen is említi, hogy már bizony ennek egyből vissza kellene térnie, amint jön a csomag.



Googlen nem találtam semmit.
Ahhoz kellene, hogy pl egy pingre válaszoljon, meg amolyan "bridge" szeretet töltene be. (Sajnos a válaszoláshoz el sem jutok így). Tudom, hogy nem pont erre tervezték a programot, de drivert azért mégse kellene írni emiatt...

Valaki használta már? Ötlet? Valami? Mielőtt megörülök miatta?

Ps: jah 1msre lehet állítani a timeoutot, de úgy is néha túl lassú lesz és megszakad miatta a kapcsolat...
Mutasd a teljes hozzászólást!
Nem hiszem el, csak fel kellett tenni a kérdést, és richtig hogy egyből meglesz a válasz... Pedig legalább 3-4 órája csak a sötétben tapogatóztam...

A hiba az volt, hogy csak pingeltem, ami túl adat volt ahhoz, hogy kiváltsa a read eseményt, viszont a timeout attól függetlenül működött...

Viszont van egy pcap_setmintocopy() nevű függvényke, amivel be lehet állítani, hogy akár 1 byte után is jelezzen.

Így sikerült megoldani, hogy CPU load nélkül azonnal megkapok minden csomagot és válaszolni is tudok rájuk. Hurrá!

[modiknak: megjelölném megoldásnak a hozzászólásomat, mert tényleg ez használt, de amennyiben lehet a pontot azért nem kérném, mert segítettem önmagamon... ]

p:= pcap_open(PChar(Name),65536,0,0,nil,@errbuf); pcap_setmintocopy(p,0); while true do begin pcap_next_ex(p,@header,@data); // adatok feldolgozása, etc... end;
Mutasd a teljes hozzászólást!

Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd