[so2] [Tema 5] Nelamurire bind, connect si aflare adrese

Georgiana Diana geodiana93 at gmail.com
Thu May 19 11:25:08 EEST 2016


Buna,

2016-05-18 11:29 GMT+03:00 Georgiana Diana <geodiana93 at gmail.com>:

>
>
> 2016-05-18 10:47 GMT+03:00 Madalina Hristache <
> madalina.hristache at gmail.com>:
>
>> Georgiana Diana via so2 <so2 at cursuri.cs.pub.ro>:
>> > Buna,
>> > Am o nelamurire in legatura cu implementarea functiei connect:
>> >
>> > - Inainte de a face connect, ar trebui ca pe socket sa se apeleze bind,
>> > pentru a il lega de o adresa locala, nu ? Urmand modelul din
>> af_packet[1],
>> > mi-am declarat o structura ce va retine diverse date despre socketii cu
>> care
>> > se lucreaza. In bind, adaug in aceasta structura un camp struct
>> sockaddr_stp
>> > *, care este de fapt parametrul primit la bind.
>>
>> E bună abordarea ca idee.
>
>
> Okay, good to know :)
>
>
>> În plus, tot în bind trebuie să verifci că
>> portul din structura pe care ai primit-o ca parametru nu este deja
>> asociat cu un socket. Daca este, returnezi o valoare de eroare. Pentru
>> asta e util un hashtable, să cauți mai ușor.
>>
>
> Yep, done that.
>
>
>>
>> >
>> > - In connect, va trebui sa conectez adresa primita in bind de adresa
>> remote
>> > transmisa in connect, nu ? In cazul acesta, as vrea sa ma folosesc de
>> campul
>> > struct sockaddr_stp * setat anterior in bind.
>> > M-am uitat in implementarea lui connect din datagram.c[2] si cred ca
>> pentru
>> > a conecta cele doua adrese este nevoie de apelul ip_route_connect() ?
>> > Ce nu imi dau seama cum sa fac este cum sa obtin adresele pe 32 biti
>> > necesare apelului ip_route_connect din datele disponibile in cele doua
>> > structuri sockaddr_stp primite la bind (pentru socketul local) si
>> connect
>> > (pentru cel remote).
>>
>> În connect nu e nevoie de comanda cu ip_route. Tot ce trebuie să faci
>> e să reții cumva faptul că socketul tău este asociat cu un socket care
>> are adresa primită ca parametru. Eu mi-am declarat o structură custom
>> de socket și un câmp este struct sockaddr-ul primit ca parametru la
>> connect, să știu cu cine sunt conectat. Sper să nu zic prostii, dar
>> mie mi-a mers foarte bine abordarea asta.
>>
>
> Ah, okay, am inteles. Mult mai simplu asa :)
>


Trecand de bind si connect si ajungand la send/sendto/sendmsg, am din nou o
intrebare:

Este vreo diferenta intre sendmsg si sendto, in ceea ce priveste cazurile
de eroare ce ar trebui tratate sau campurile din struct msghdr (il voi nota
m) care sunt populate de cele doua apeluri ?

Erorile pentru ambele as zice ca sunt urmatoarele:
- socket conectat, dar campul m->msg_name setat => -EISCONN, conform[3];
- socket neconectat, dar campul m->msg_name nesetat => -ENOTCONN,
conform[3];
- (-1) pentru erori interne, conform[3].

Cat despre campurile ce vor contine mesajul efectiv, din cate inteleg din
[3], toate cele trei functii (send, sendmsg, sendto) lucreaza cu m->msg_iov
pentru a retine bufferul de trimis. Corect ?

Si similar pentru write/recvfrom/recvmsg.


>
>
>>
>> >
>> > [1]
>> http://lxr.free-electrons.com/source/net/packet/internal.h?v=3.13#L92
>> > [2] http://lxr.free-electrons.com/source/net/ipv4/datagram.c?v=3.13#L23
>
> [3] http://linux.die.net/man/2/sendto

>
>>
>> Spor! :)
>>
>> Mădă
>>
>
>
> --
> *Georgiana Diana Ciocirdel*
> Polytechnic University of Bucharest,
> Computer Science
>



-- 
*Georgiana Diana Ciocirdel*
Polytechnic University of Bucharest,
Computer Science
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://cursuri.cs.pub.ro/pipermail/so2/attachments/20160519/9475d64c/attachment.html>


More information about the so2 mailing list