Í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.
- 1581 megtekintés
Hozzászólások
a recv blokkoló művelet alapesetben!
- A hozzászóláshoz be kell jelentkezni
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);
}
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
man select
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
read() nem jo? probald meg read+select-tel.
- A hozzászóláshoz be kell jelentkezni