> P1, P2 = peer 1, 2
> 
> P1: write (100 bytes).
> P1: write (150 bytes).
> P2: read (max 200);
> 
> Conform acelui RFC, spune ca datele sunt date catre utilizator, de catre 
> stiva, la primirea flagului PUSH. Intrebarea vine: la fiecare write (am 
> cautat in manual la send si nu se specifica daca se poate controla 
> PUSH, deci o face automat stiva TCP/IP) stiva, dupa transmisia celor 
> 100byes, activeaza PUSH? Adica P2 va primi PUSH dupa cei 100byes si 
> inca un PUSH dupa cei 150? Cum va reactiona read ();? Va citi 200 
> bytes: 100 din primul write si 100 din cel de-al doilea? Sau stiva se 
> asigura ca primeste cei 100 la un read si urmatorii 150 la un alt read?

La write, google for Nagle Algorithm, man 7 tcp /TCP_NODELAY.

read, daca se apeleaza, intoarce ce e in buffer pana atunci. Tu poti sa
faci read() pe un buffer de 10.0000 bytes si sa-ti intoarca si 1 byte,
daca doar atat a citit (teoretic, cel putin).

> Se poate intampla ca de la primul write sa primesc mai putin de 100 
> bytes pe available, la read, necesand un al doilea read pentru a citi 
> in totalitate cei 100bytes de la primul write?

Da.

Daca vrei sa citesti un "record", trebuie sa apelezi read() de cate ori
e necesar, pana ai citit sizeof(record).

---

sofar = 0;
do {
        r = read(.....);

        if (r > 0)
                sofar += r;

        if ((r == -1) && (errno != EINTR))
                eroare....

        if (r == 0)
                eof...

} while (sofar != toread);

---

>   Claudiu Cismaru

Matei

PS: suntem offtopic.

--- 
Detalii despre listele noastre de mail: http://www.lug.ro/


Raspunde prin e-mail lui