TCP kapcsolat recv nem tér vissza

 ( kaltsi | 2006. április 23., vasárnap - 18:22 )

Írtam egy kis servert (s1), amihez ha kapcsolódik egy kliens, akkor a server kapcsolódik egy másik serverhez (s2). Az S2 egyenlőre annyit csinál, hogy amit kap azt szétküldi a többi kapcsolódott clienshez. Ha az S1-hez kapcsolódik több kliens és az egyik küld valamit, akkor az egyik a küldőn kívül megkapja megkapja. De ezt követően a S1 nem tér vissza a recv(..) az első kiolvasást követően.
Ha csak egy cliens csatlakozik a S1-hez és egy másik a S2-höz, akkor tökéletesen kommunikál egymással a két kliens. (S1 ugyebár csatlakozik S2-höz)

Esetleg valakinek van ötlete.

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

a recv blokkoló művelet alapesetben!

A kapcsolatokat mindig non block állapotba teszem a következő függvénnyel.

void SetNonblocking(int sock)
{
int opts;

opts = fcntl(sock,F_GETFL);
opts = (opts | O_NONBLOCK);

fcntl(sock,F_SETFL,opts);
}

Próbáld meg így is:

int option= 1;
ioctl (sock, FIONBIO, &option);

Az open(2) nálam azt írja (persze lehet hogy téved, vagy rosszul értem):
O_NONBLOCK or O_NDELAY: When possible, the file is opened in non-blocking mode. (...) This mode need not have any effect on files other than FIFOs.

man select

De az az érdekes, hogy kiolvassa az bejövő adatokat, csak mikor -1 -gyel térne vissza, hogy nincs több adat, akkor nem tér vissza.

Hat igy eleg homalyos a dolog, ha ki tudnad tenni valahova, hogy kukkintsunk bele, esetleg leesne valami. Persze s1, s2 meg a kliensek is kellenenek.

read() nem jo? probald meg read+select-tel.