Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 13 odgovora
  • 4.756 pregleda

Najnovija ↓

Broken pipe 29.06.2003. u 21:26 · pre 284 meseca #1
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 ?
Re: Broken pipe 30.06.2003. u 11:05 · pre 284 meseca #2
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
Re: Broken pipe 30.06.2003. u 17:05 · pre 284 meseca #3
Bilo bi lepo kada bi se UNIX programeri javili, valjda na ovom forumu jos uvek ljudi pomazu jednim drugima?
Re: Broken pipe 30.06.2003. u 18:22 · pre 284 meseca #4

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::).

Re: Broken pipe 30.06.2003. u 19:01 · pre 284 meseca #5
gde si nasao ovo?
odem na M-x, i sta onda?
ne vidim nista u vezi libc-a i funkcije send() ?
Re: Broken pipe 30.06.2003. u 19:14 · pre 284 meseca #6
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.
Potpis
Možda se moje mišljenje promenilo, ali ne i činjenica da sam u pravu.
Re: Broken pipe 30.06.2003. u 19:16 · pre 284 meseca #7
Citat:
filmil:

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



Koliko kucanja da bi se dobilo F1. Strašno...
Potpis
IOCC
Re: Broken pipe 30.06.2003. u 19:22 · pre 284 meseca #8
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
Potpis
Možda se moje mišljenje promenilo, ali ne i činjenica da sam u pravu.
Re: Broken pipe 30.06.2003. u 19:31 · pre 284 meseca #9
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.
Re: Broken pipe 01.07.2003. u 02:43 · pre 284 meseca #10
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
Re: Broken pipe 01.07.2003. u 11:27 · pre 284 meseca #11

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

f
Re: Broken pipe 01.07.2003. u 21:08 · pre 284 meseca #13
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>

Potpis
With a PC, I always felt limited
by the software available.
On Unix, I am limited only by my knowledge.

--Peter J. Schoenster
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme