[ Predrag Damnjanovic @ 29.06.2003. 20:26 ] @
Imam problem sa funkcijom send().
U pitanju je jedan TCP client i server.
Server lepo radi, sve dok ne izgubi konekciju sa klijentom.

Dakle, recimo klijentu pukne veza, a server (normalno) to ne zna, jer se klijent nije normalno diskonektovao, već je njegova veza pukla.
Ako server pokuša nešto da pošalje klijentu, kroz socket, dešava se nešto čudno.
Na windows-u funkcija send() lepo vrati -1, što znači da je socket 'prso'.

Ali, na Linuxu, kada prvi put zovnem send() - funkcija vrati broj poslatih bajtova - kao da je sve u redu, kao da je poslao string !?!
Ako ponovo zovnem send() - načiću se u konzoli sa porukom : Broken pipe, i ceo program padne.
Nikad mi ne vraća -1.

Sors je isti i za Win i za UNIX, naravno na windowsu imam onu WSA inicijalizaciju...
U čemu je problem ?
[ Rapaic Rajko @ 30.06.2003. 10:05 ] @
Elem, ja sam laik za ovu temu, ali se meni cini da te zeza neki buffer. Kanda send() upise podatke u buffer (i vrati broj bajtova), pa tek na sledeci poziv send-a se vrsi stvarno slanje (flush) i tada cela stvar puca.
A mozda na Linux-u postoji citav jedan medjusloj (znaci, ne samo buffer) vise nego na Windows-u...
Poz

Rajko
[ Predrag Damnjanovic @ 30.06.2003. 16:05 ] @
Bilo bi lepo kada bi se UNIX programeri javili, valjda na ovom forumu jos uvek ljudi pomazu jednim drugima?
[ filmil @ 30.06.2003. 17:22 ] @

Predraže,

opet patiš od nečitanja dokumentacije. :) Pročitaj stranu o funkciji send() iz dokumentacije za libc. Evo kako dotična počinje kod mene. (vidi dole) Pročitaj ostatak i valjda će se i sijalica upaliti.

Ne zaboravi, komanda M-x h i m libc RET je tvoj prijatelj. :) Tj. ako koristiš emacs. Nemam pojma kako se slično dobija u onom drugom editoru.

f

Citat:

File: libc.info, Node: Sending Data, Next: Receiving Data, Up: Transferring Data

Sending Data
............

The `send' function is declared in the header file `sys/socket.h'.
If your FLAGS argument is zero, you can just as well use `write'
instead of `send'; see *Note I/O Primitives::. If the socket was
connected but the connection has broken, you get a `SIGPIPE' signal for
any use of `send' or `write' (*note Miscellaneous Signals::).

[ Predrag Damnjanovic @ 30.06.2003. 18:01 ] @
gde si nasao ovo?
odem na M-x, i sta onda?
ne vidim nista u vezi libc-a i funkcije send() ?
[ tOwk @ 30.06.2003. 18:14 ] @
Citat:
filmil:
Ne zaboravi, komanda M-x h i m libc RET je tvoj prijatelj. :) Tj. ako koristiš emacs. Nemam pojma kako se slično dobija u onom drugom editoru.


Sigurno je Filip mislio na C-h i m glibc RET ili M-x info RET m glibc RET.

Ako već ovo nije jasno, probaj npr. „samostalni info čitač“ sa „info glibc“.

U svakom slučaju, kada dovde stigneš, samo uradi „i send RET“, i u svakom slučaju ćeš dobiti isti rezultat, a to je ona stranica koju Filip pominje.
[ Dragi Tata @ 30.06.2003. 18:16 ] @
Citat:
filmil:

Ne zaboravi, komanda M-x h i m libc RET je tvoj prijatelj.



Koliko kucanja da bi se dobilo F1. Strašno...
[ tOwk @ 30.06.2003. 18:22 ] @
Pa nemoj tako Nemanja, na ovaj način se izvrši i pretraga čitave pomoći na sistemu ;-)

Ako hoćeš kraće rešenje, samo odeš iznad „send(...)“ funkcije i kucaš C-h S
[ filmil @ 30.06.2003. 18:31 ] @
Citat:
tOwk:
Sigurno je Filip mislio na C-h i m glibc RET ili M-x info RET m glibc RET.


Pardon. Dakle gore je citirana (ispravna) dobitna kombinacija by tOwk.

f

ps. Za Tatu: pretpostavka da čovek nije napravio prečicu... :>

... i posle se pitaju koji je najbolji editor.
[ Predrag Damnjanovic @ 01.07.2003. 01:43 ] @
dakle, resen problem

ako neko u buducnosti ima ovaj problem, treba samo da
#include <signals.h>
i negde na pocetku programa uradi:
signal(SIGPIPE, SIG_IGN);

naravno, treba staviti to pod #ifdef ako pisete portabilnu aplikaciju

hvala svima na pomoci
[ filmil @ 01.07.2003. 10:27 ] @

Takođe bih pogledao i fleg MSG_NOSIGNAL koji isključuje SIGPIPE samo za funkcije send/recv, a ne globalno.

f
[ Predrag Damnjanovic @ 01.07.2003. 15:27 ] @
ajd probacu... :)
deluje kao pravo resenje, bas mi to treba...
[ BORG @ 01.07.2003. 20:08 ] @
Citat:
Predrag Damnjanovic:
dakle, resen problem

ako neko u buducnosti ima ovaj problem, treba samo da
#include <signals.h>
i negde na pocetku programa uradi:
signal(SIGPIPE, SIG_IGN);

naravno, treba staviti to pod #ifdef ako pisete portabilnu aplikaciju

hvala svima na pomoci


Ispravka ..

#include <signal.h>

[ Predrag Damnjanovic @ 01.07.2003. 21:08 ] @
bolje je ovo drugo, da stavljas MSG_NOSIGNAL kod send() i recv()...