nc (netcat), socat és az udp csomagok

Fórumok

Valamit még mindig nem értek ezekkel a progikkal kapcsolatban. Vegyük először az nc -t:

$nc -p 10000 -s 192.168.1.123 -lun

Ez így elvileg fogadja a 192.168.1.123 címre (ez egyben a gép címe), a 10000 socketra érkező csomagokat.
Egy másik gépen a LAN -on:

$echo `date` "bubu: hello" | nc 192.168.1.123 10000 -u

Ez így szépen dátum/idő -val elküldi a kis üzenetet és kilép. Egyszer! Utána akár hányszor, akár hogy próbálom nem veszi le, csak ha újraindítom a másik gépen az nc -t.

Ugyanez a socat -el nagyjából így föst az első gépen:

$socat UDP-LISTEN:10000,bind,192.168.1.123 -

(A bindet azért használom mert több hálókártya is van a gépben)
Ezután a másik gépen bepötyögöm az ismert üzenetet, de most a socat segítségével:

$echo `date` "bubu: hello" | socat UDP:192.168.1.123:10000 -

Megint szépen elküldi ... egyszer :( Soha többé, míg újra nem indítom a listen módú socketet a másik gépen. Próbáltam a netcat vs. socat, ugyanaz az eredmény. Viszont, ha a másik gép XP és az én kis bugyuta udp programocskámat használom semmi ilyet nem tapasztalok.
Miért áll le egy üzenet elküldése/fogadása után a fogadó oldal?
Az én általam írott kis socket kommunikációs interfészek sem csinálnak ilyesmit, itt valami protokoll lehet amiről én nem tudok?

Hozzászólások

Hm.. fura, TCP-vel ez megy, UDP-vel nem :/

egyik peer: while true ; do nc -ln 192.168.1.3 10000 ; done
másik peer: echo `date` "crok: hello" | nc 192.168.1.3 10000
[szerk.]..most látom van egyszerűbb megoldás:
egyik peer: nc -lkn 192.168.1.3 10000
másik peer: echo `date` "crok: hello" | nc 192.168.1.3 10000

Hibátlanul, bármennyiszer..

[OFF]
A legegyszerűbb chat service :D
egyik peer: while true ; do nc -ln 192.168.1.3 10000 ; done
másik peer: while true ; do nc -n 192.168.1.3 10000 ; done
[szerk.]..most látom van egyszerűbb megoldás:
egyik peer: nc -lkn 192.168.1.3 10000
másik peer: nc -n 192.168.1.3 10000
[/OFF]

---------
http://evilrouters.net/2011/10/27/choose-internetworking/

Mondjuk egy ilyen nálam műküdik:


$ nc -d -k -u -vv -w 1 -l localhost 10000
$ echo `date` "bubu: hello" | nc -u localhost 10000

netcat -lu

csak egy sessiont kezel. (a tcp-nel ez sokkal jobban latszik).
Vagyis egy szalat, egy kapcsolatot. Tobbet nem.

- megnyitja a 10000 porton.
- listenel.
Aztan kap egy kerest, es ugye az UDP-ben nincs session kezeles. Csak csomagok vannak. Ugy veszi, hogy az elso megkapott csomag FORRAS port cime lesz a ketirenyu kapcsolat tulso oldala.

Amikor egy ujabb echo | netcat -ot mondasz, akkor az uj forras port cimet vesz, es az emiatt kivulesik a netcat -l erdeklodesi koren.

Az alabbi viszont mukodik:

netcat -lun localhost -p 10000

for i in {1..100}; do
echo $i alma | netcat -u -q0 localhost 10000 -p 3333
done

mert ekkor a kulonbozo netcat kliensek mindegyike ugyanazt a forras oldali port cimet (3333) veszi, tehat a szerver egy sessionnak hiszi azokat.

Értem, köszönöm!
Leginkább saját megírt progikat használtam ilyesmihez, ott ez fel sem merült - listen a port címen, akárkitől akármi jön OK.
A "localhost" megoldást azért nem szoktam tudni használni, mert többnyire két hálókártyát használok, esetleg ppp és akkor most melyik is?

* Én egy indián vagyok. Minden indián hazudik.