извършва директно използвайки примитивите на протоколния стек и драйверната програма или чрез сокети. • Сокетът от мрежова гледна точка е комбинация от IP адрес и порт. • От гледна точка на програмиста е абстракция, която представя конкретна мрежова връзка като файл. BSD Sockets
• BSD сокетите са създадени за Unix.
• Имат две фамилии за локална комуникация – AF_UNIX и за мрежова – AF_INET. При първите адреса и път и име на файл, а при вторите – комбинация от IP адрес и порт. • Мрежовите сокети може да се разделят на TCP/UDP/Raw. Сокети • Клиентската станция извършва следните действия за осъществяване на комуникация: • 1. Създаване на сокет и получаване на дескриптор от ОС. • 2. Свързване на сокета към сървърен такъв. • 3. Трансфер на данни. • 4. Затваряне на сокета. • Сървърната станция извършва следните действия за осъществяване на комуникация: • 1. Създаване на сокет и получаване на дескриптор от ОС. • 2. Обвързване на сокета с локален адрес и порт. • 3. “Слушане” за клиентски заявки и добавяне на заявките в опашка за обработване. • 4. Приемане на заявка от опашката. (Създава се нов сокет по време на обмена.) • 5. Трансфер на данни. • 6. Затваряне на сокета. Поточни сокети (TCP) Дейтаграмни сокети (UDP) Сокет API: Създаване на сокет #include <sys/types.h> #include <sys/socket.h> int socket (int domain, int type, int protocol); – Връща файлов дескриптов или -1 при грешка. – Domain е PF_UNIX или PF_INET. – Type може да е: • SOCK_DGRAM – за дейтаграмни (UDP) • SOCK_STREAM – за поточни (TCP) • SOCK_RAW – прескача транспортния слой – Protocol обикновено е 0, тъй като се подразбира от type, но при SOCK_RAW е нужно да се зададе IPPROTO_IP. Сокет API: Обвързване на сокет
int bind (int sid, struct sockaddr ∗addrPtr, int len)
– Обвързва сокета чрез неговия дескриптор към адреса (IP и порт). – sid е дескрипора на сокета. – addrPtr е указател към структура, съдържаща адреса на сокета. – len е дълйината на тази структура в байтове. Необходимо е да се зададе, тъй като при различните фамилии сокети, тя е различна. Сокет API: Адресиране на сокет • За фамилия Интернет: struct sockaddr_in { sa_family_t sin_family; // = AF INET in_port_t sin_port; // port number struct in_addr sin_addr; // IP address } • За Unix фамилия (работят само м/у процеси на една машина) struct sockaddr_un { uint8_t sun_length; // short sun_family; // = AF LOCAL char sun_path[100]; //null terminated pathname } • Когато използваме интернет сокети, втория параметър на bind() трябва да се преобразува (от тип sockaddr_in *) в (sockaddr *). Сокет API: Слушане/приемане на сокет int listen (int sid, int backlog) – Слуша за входящи заявки за отваряне на сокет. – sid е дескрипора на сокета, на който слуша. – backlog е броя на чакащите заявки. int accept (int sid, struct sockaddr ∗addrPtr, int *lenPtr) – Приема заявките от listen() и създава сокет. Връща дескриптор на сокет, който ще се ползва след това за обмен, и адрес на подателя. – Последния параметър е указател към променлива, където ще се запази дълйината на адреса. Нужно е да е указател, тъй като функцията ще го запише. Сокет API: Свързване към сокет
int connect (int sid, struct sockaddr ∗addrPtr, int
len) – Свързва се към зададения сървърен адрес. – sid е дескрипора на сокета, създаден при клиента с socket(). – addrPtr е указател към структура, съдържаща адреса на сървъра. – len е дълйината на тази структура в байтове. Необходимо е да се зададе, тъй като при различните фамилии сокети, тя е различна. Сокет API: Изпращане/получаване (TCP) int send (int sid, const char ∗bufferPtr, int len, int flag) – sid е дескрипора на сокета, на който се праща – този получен от accept(). – bufferPtr е съобщението, а len – дължината му. – Flag – обикновено е 0, използва се за подаване на параметри към стека. int recv (int sid, const char ∗bufferPtr, int len, int flag) – Получава информация от сокет. – Има същите параметри като send(). Сокет API: Изпращане/получаване (UDP) int sendto (int sid, const void ∗bufferPtr, size_t bufferLength, int flag, struct sockaddr ∗addrPtr, socklen_t addrLength)
• Изпраща съобщение, зададено от bufferPtr, с
дължина bufferLength към адрес, указан в addrPtr, с дължина addrLength. Връща броя изпратени байтове ли -1 при грешка. int recvfrom (int sid, const void ∗bufferPtr, size_t bufferLength, int flag, struct sockaddr ∗addrPtr, socklen_t *addrLengthPtr) • Получава съобщение в bufferPtr, с дължина bufferLength от неуказан адрес. В addrPtr, с дължина addrLength се записва подателя на съобщението. Връща броя получени байтове ли -1 при грешка.