Keresés

Részletes keresés

NevemTeve Creative Commons License 2013.04.10 0 0 107

A méréseim végeredménye az volt, hogy linuxon az errno mindenképpen (*__errno_location ()) lesz (és így szálakkal vagy anélkül is jól megy),  AIX-on hasonló eredményhez kell a _THREAD_SAFE szimbólum fordításkor.

_lala_ Creative Commons License 2013.04.10 0 0 106

A lenti leírásom a Linuxos megoldásra vonatkozik. Hogy az AIX mit csinál, azt nem tudom, de arra emlékszem, hogy a Linux-szerű shared library kezelés, az nincs/totál máshogy van AIX alatt, szóval nem lennék meglepve, ha ott ezzel gond lenne.

Előzmény: _lala_ (105)
_lala_ Creative Commons License 2013.04.10 0 0 105

Namostan a gondot ott vélem látni, hogy ha én egy szegény kis alprogram vagyok, aki nem tud arról, hogy a hívóm multithread-et akar, akkor egycsapásra rossz errno-t fogok kiolvasni, jól csalódom? Ha viszont fordítva, hívottként multithread-re készülök fel, akkor a hívóm még lehet thread-telen?

 

Az első verzió (multithreades a program) csak úgy tud működni, ha _minden_ lib, amit használsz, multithreadesre van fordítva. Ekkor a thread library belinkelése miatt a programba olyan verzió kerül az errno-elérő-függvényből, ami thread-local errno változót használ.

Ha nem multithreades a programod, akkor ugye alapból direktben éri el a globális errno változót a program, viszont ekkor nem gond, ha a lib multithreadesre van fordítva, mert akkor ő függvényen keresztül fogja elérni ugyanezt a globális errno-t. Ekkor ugyanis a libc-ben levő default verzió lesz belinkelve a programba, amit ezt csinálja.

Szóval az errno-elérő-függvénynek két verziója létezik, attól függően, hogy a program multithreadesre van-e linkelve.

Előzmény: NevemTeve (103)
NevemTeve Creative Commons License 2013.04.08 0 0 104

Mérési eredmények:

1. linuxon a hiba nem jelentkezik, mert ot mindig __errno_location-nal dolgozik.

2. AIX-on a hiba jelentkezik, mert ott a fordítási opción múlik az errno átalakítása/meghagyása.  Viszont lehet nem-multithread-es főprogramból hívni multithread-es alprogramot (legalábbis a _Errno miatt nincs gond, mert az benne van a libc-ben). Az illetékes fordítási opció a -D_THREAD_SAFE.

Előzmény: NevemTeve (103)
NevemTeve Creative Commons License 2013.04.08 0 0 103

Akkor most hogy is van az errno meg a pthreads?

 

linux, pthreads esetén:

  volt: int ern= errno;

  lett: int ern= (*__errno_location ());

 

AIX, pthread esetén:

  volt: int ern= errno;

  lett: int ern= (*_Errno());

 

Namostan a gondot ott vélem látni, hogy ha én egy szegény kis alprogram vagyok, aki nem tud arról, hogy a hívóm multithread-et akar, akkor egycsapásra rossz errno-t fogok kiolvasni, jól csalódom? Ha viszont fordítva, hívottként multithread-re készülök fel, akkor a hívóm még lehet thread-telen?

NevemTeve Creative Commons License 2012.12.07 0 0 102

select és poll a két legkézenfekvőbb lehetőség több kapcsolat egyidejű figyelésére.

Előzmény: artiny (100)
_lala_ Creative Commons License 2012.12.06 0 0 101

A szerver résznek párhuzamosan több dolgot is kell tudnia csinálni (miközben beszélget az egyik klienssel, közben kell tudnia fogadni egy másik kliens kapcsolódását is, utána pedig nyilván mindkét klienssel kell tudnia egyidőben beszélgetni).

Nézd meg valami kisebb szerver program forrását, hogy hogy csinálják (általában az az egyszerűbb, hogy a kliensektől jövő minden egyes kapcsolathoz indít a szerver egy gyereket, és a gyerek kezeli az adott kliens kapcsolatát, a szerverprogram pedig várja a következő kliens kapcsolódását).

http://www.tutorialspoint.com/unix_sockets/socket_server_example.htm

Előzmény: artiny (100)
artiny Creative Commons License 2012.12.06 0 0 100

Azt szeretném megkerdezni,hogy hogyan kell osszefuzni tobb clienst egy serverrel ?  (C ben linux alatt)

 

Ez a tcp server es kliensem:

 

http://pastebin.com/nmLp0taD

 

http://pastebin.com/re7n6zfs

 

Azt szeretném hogy egyenlore meg egy cliens is tudjon irni a serverre. ... mit kell valtoztatni,hogyan nézne ki?

NevemTeve Creative Commons License 2010.10.22 0 0 99
Egy kis érdekesség: Hányféleképpen kapcsolhatunk nonblocking üzemmódba?

1.
    open ("name", O_NDELAY);
2.
    open ("name", O_NONBLOCK);
3.
    int optval= 1;
    ioctl (handle, FIONBIO, &option);
4.
    fcntl (handle, F_SETFL, O_NONBLOCK);
5.
    int optval= 1;
    setsockopt (handle, SOL_SOCKET, SO_NONBLOCK, &optval, sizeof (optval));

Azt a felfedezést tettem, hogy linux-ban ezek mind egyformák, AIX-ben viszont az első kettő különbözhet; a fordítási opciók szerencsétlen állása esetén ("SystemV mód") egy olyan üzemmódba juthatunk, amikor egy read(2) a 'nincs adat' esetet nulla visszaadásával jelzi, ami viszont az EOF jele. Na az ilyen dolgok teszik széppé a UNIX-programozást.
NevemTeve Creative Commons License 2010.10.17 0 0 98
Köszi, azóta én is érleltem magamban a dolgot, és arra jutottam, hogy ez osz-posz olyan, mint az UDP, talán azzal a különbséggel, hogy
1. itt a 'connect' ellenőrzi a cím létezését
2. itt lehetnek cím nélküli komponensek, UDP-ben mindenkinek van portja, ha nem programból, akkor az OS oszt valamit.
Köszi mégegyszer!
Előzmény: _lala_ (97)
_lala_ Creative Commons License 2010.10.17 0 0 97
amit ők írnak (send(2),write(2)), azt a server olvashatja (read(2),recv(2)), viszont a server nem írhat(!).

Szerintem a szerver is vissza tud írni, feltéve, hogy a kliens bindolt magának valami címet. De azt sem tartom kizártnak, hogy még bindolás nélkül is lesz valami olyan címe, amit a recvfrom() szépen beleköhög a megadott cím struktúrába, majd ugyanerre a címre a sendto()-val szépen visszaküldi a választ.


Unix-domain socketnél van olyan is, hogy egy file descriptort "átküldesz" a socketon keresztül a túlsó oldalnak.

man cmsg, recvmsg, sendmsg, SCM_RIGHTS
Ezt kéne tudnia az AIX-nak is, elég régi BSD tudomány.
Előzmény: NevemTeve (96)
NevemTeve Creative Commons License 2010.10.14 0 0 96
Olyan ötletem támadt, hogy kipróbálom, lehet-e bizonyos kontextusban helyettesíteni a pipe-okat unix-domain-socket-ekkel (ok: AIX-on a pipe-okra nem működik a SIGIO... kár).

Hát, bizonyos konytextusban lehet: ha a 'socket(2)'-ben 'SOCK_DGRAM' van megadva, akkor olyasmi lesz, mint a pipe (vagy talán inkább olyasmi, mint az UDP): nevezetesen van bind(2) és connect(2), de nincs listen(2) és accept(2), a klienseket automatikusan elfogadja a szerver (vagy még inkább: nincs is kapcsolat, csak egyedi üzenetek), amit ők írnak (send(2),write(2)), azt a server olvashatja (read(2),recv(2)), viszont a server nem írhat(!).

Ha viszont SOCK_STREAM-mel megyünk, akkor nagyjából ott vagyunk, mint a TCP-vel, accept+listen+select, kliensenként külön kapcsolat... tényleg, pont mint TCP-ben; egy dolog különbözik: a kliensnek nincs 'címe', csak annyit tudunk róla, hogy ő egy kliens a lokális gépről (naná).

(Most így utólag nézve a unix(7) manult, van egy olyan is, hogy SOCK_SEQPACKET, ami stream, de megőrzi az üzenethatárokat. Gyenge pontja viszont, hogy linux-only...)

PS: esetleg meg lehetne próbálni, hogy a kliens is hozzábindeli magát egy fájlhoz, és attól kezdve őt is lehetne azonosítani, továbbá a SOCK_DGRAM-ban sendto-val küldhetne neki a server... (ez persze csak egy teszteletlen elképzelés)
locsemege Creative Commons License 2008.01.30 0 0 95
Ugyanis a PIC-ben preemptív multitaszking van

Ezt szerintem Te döntöd el, mi van ott. Meg azt is, mit hogyan zárolsz, hogyan oldod meg a kölcsönös kizárásokat.
Előzmény: vIstvan (92)
vIstvan Creative Commons License 2008.01.30 0 0 94
Akár egy timeout-tal is. Vagy ha UDP csomagot küldök akkor adatvesztéssel. Ne azt válaszold, hogy az UDP pont erről szól!:-)
Előzmény: NevemTeve (93)
NevemTeve Creative Commons License 2008.01.30 0 0 93
És ez milyen következménnyel jár a másik oldalon?
Előzmény: vIstvan (92)
vIstvan Creative Commons License 2008.01.30 0 0 92
Nem egészen. Ugyanis a PIC-ben preemptív multitaszking van és adott esetben ez blokkolhatja az adatfolyamot, ha emlékszel a Win3.0 és 3.1-re akkor ott volt ugyanez a probléma. És ez csak egy része.
Előzmény: locsemege (91)
locsemege Creative Commons License 2008.01.24 0 0 91
Ha szabványos a felület, nem teljesen mindegy, hogy mikrokontroller, vagy bármi más lóg a kábel másik végén?
Előzmény: vIstvan (90)
vIstvan Creative Commons License 2008.01.24 0 0 90
A témában én is érintett vagyok, értelemszerűen Linux alatt. Az "ellenoldal" az PIC18F660 és rokonai, beépített Ethernet konttollerrel, műszervezérléshez használjuk.

Van még valaki aki efféle témákban utazik?
NevemTeve Creative Commons License 2007.06.15 0 0 89
Persze, csak ha éppen pipe-is van köztük, arra nem minden UNIX-ban működik a SIGIO... nem akarom most az AIX-ot külön megemlíteni...
Előzmény: NevemTeve (88)
NevemTeve Creative Commons License 2007.03.20 0 0 88
Nem socket, de UNIX: ha SIGIO-val akarnék asynchron IO-t kezelni, ne adj isten egyszerre több file-t is (mondjuk egyet a főprogramból, egyet pedig valamilyen könyvtári szubrutinból, amit mondjuk valaki más írt, réges-régen), lenne-e értelme egy külön szubrutint kifejleszteni, amolyan köztes réteget, amelynek a hívó megmondaná, hogy melyik handle olvashatóvá válása esetén milyen rutint kell a SIGIO szignál érkezésekor meghívni?
NevemTeve Creative Commons License 2006.08.30 0 0 87
Persze más lenne a helyzet az olyan protokolloknál, ahol a két fél egymástól függetlenül azt küld amit akar... ilyenkor a legjobb úgy tervezni, hogy amire nem kaptam választ/nyugtát, azt a következő kapcsolatfelvételnél újra kell küldeni, illetve előfordulhat hogy az ellenoldal az újbóli kapcsolatfelvétel olyasmit küld el, ami szerintünk már egyszer jött..
(Mondjuk ennek már nincs igazán köze a TCP-hez)
Előzmény: NevemTeve (86)
NevemTeve Creative Commons License 2006.08.30 0 0 86
Én mondjuk nem hívtam 'shutdown' sohasem...
Kliens-oldalon amikor az utolsó kérdésre megkaptam a választ a szervertől, egyszerűen lezárom a socketet (close), szerveroldalon viszont csak akkor zárom le a kapcsolatot, ha a recv <=0-t ad vissza (kivéve az EWOULDBLOCK-ot természetesen), ja és setsockopt (SOL_SOCKET, SO_KEEPALIVE) is kell.
Előzmény: NevemTeve (84)
NevemTeve Creative Commons License 2006.05.30 0 0 85
TCP-State-Diagram

Ahogy én látom, a shutdown (SD_RECEIVE=SHUT_RD=0) nem küld a partnernek semmit, csak bejelenti a lokális rendszernek, hogy nem akar többet olvasni (ez persze adatvesztést okozhat).

A shutdown (SD_SEND=SHUT_WR=1) elküld a partnernek egy FIN-t (a már várakozó byte-ok mögé kerül a sorba, tehát nem okoz adatvesztést) és FINWAIT-1 állapotba megy át. A partner ezt EOF-ként fogja érzékelni, nyugtázza és CLOSE_WAIT állapotba kerül.
Előzmény: NevemTeve (84)
NevemTeve Creative Commons License 2006.03.10 0 0 84
Gyakori kérdés, hogy kell-e shutdown-t hívni a close (closesocket, soc_close stb) előtt, és ha igen, akkor a shutdown és a close között mennyit illik várni.

WSKFAQ: 2.10 - What's the proper way to close a TCP socket?

Másik ilyen kérdéses rész a graceful/non-graceful close

msdn: closesocket, graceful shutdown
NevemTeve Creative Commons License 2003.10.17 0 0 83
Ez a REUSEADDR, de hogy UDP-re vonatkozik-e... a kolléga gépén viszont sig11-fordult elő, az pedig hw-hibát jelent, a kernele összezavarodott...
Előzmény: szipka (81)
Szeder Creative Commons License 2003.10.16 0 0 82
Nem sajat program, Enemy Territory... (;
Ugyanakkor hogyha nem is azonnal, de vmi timeouttal be kellene csukodnia neki, ellenben ez reggelre se csukodott be. misztik.
Előzmény: szipka (81)
szipka Creative Commons License 2003.10.16 0 0 81
Van valami setsockopt parameter, amivel be lehet allitani, hogy ha meghal egy process, akkor rogton szabaditsa fel a portot. Egyebkent c,c++, socket programozasa egy remalom, annyit szivtunk mar vele, van egy csomo parameter, es ezek kombinacioja, blocking, non-blocking socketek, select es timeout-ok, stb... Soksok turelem es lelkiero, kell hozza, de megeri. Nincs is szebb erzes, mint amikor az ember megirja az elso TCP/IP szerveret, ami gyors, hatekony stb...
Előzmény: Szeder (80)
Szeder Creative Commons License 2003.10.16 0 0 80
rootkent futtattam.
Előzmény: NevemTeve (79)
NevemTeve Creative Commons License 2003.10.16 0 0 79
Mármint root-ként kellene ezeket futtatni...
Előzmény: Szeder (78)
Szeder Creative Commons License 2003.10.16 0 0 78
Probaltam, nem irnak semmi hasznalhatot, konkretan netstatnal a PID egy '-', fuser meg semmit nem ir ki, ami egyebkent osszhangban van azzal, hogy ps aux sem mutatja mar a megdoglott et processzeket. memtest86 hibat nem talal [bar a 10es és 11es teszteket nem vartam meg, mert kellett a gep, majd kesobb].
Viszont a reboot tenyleg bezarta a portot <;
Előzmény: NevemTeve (77)

Ha kedveled azért, ha nem azért nyomj egy lájkot a Fórumért!