ESP2023 Sockets

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 13

Програмиране на Вградени системи

Сокет програмиране
Мрежово програмиране

• Мрежовото програмиране може да се


извършва директно използвайки
примитивите на протоколния стек и
драйверната програма или чрез сокети.
• Сокетът от мрежова гледна точка е
комбинация от 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 при грешка.

You might also like