21.10.1 Вызовы в серверной программе UDP

We use cookies. Read the Privacy and Cookie Policy

21.10.1 Вызовы в серверной программе UDP

1. sockMain = socket(AF_NET, SOCK_DGRAM, 0);

Семейство адресов — снова Интернет.

2. bzero((char *)&servAddr, sizeof(servAddr));

servAddr.sin_family = AF_INET;

servAddr.sin_addr.s_addr = htonl(INADDR_ANY);

servAddr.sin_port = 0;

Вызовы инициализации адресной структуры сервера те же, что и в программе для TCP.

3. bind(sockMain, &servAddr, sizeof(servAddr));

Как и прежде, bind получает порт для сервера и записывает значения в TCB. Конечно, по сравнению с TCP, UDP содержит очень мало информации.

4. getsockname(sockMain, &servAddr, &length);

Использовать getsockname, чтобы извлечь присвоенный socket порт.

5. msgLength = recvfrom(sockMain, buf, BUFLEN, 0, &clientAddr, &length);

Вызов recvfrom имеет форму:

recvfrom(дескриптор_socket, входной_буфер, длина_буфера, флаги, исходная_адресная_структура, указатель_на_длину_исходной_адресной_структуры)

Флаги позволяют вызывающей стороне просмотреть сообщение без его фактического получения. После возвращения исходная адресная структура заполняется IP-адресом и номером порта клиента. Необходим указатель на длину исходного адреса, поскольку она может быть изменена при вставке в поле фактического адреса клиента.

6. inet_ntoa(clientAddr.sin_addr);

Этот вызов преобразует 32-разрядный адрес Интернета клиента в знакомую нам нотацию этого адреса с точками и десятичными значениями.