11.15. Функция udp_connect

We use cookies. Read the Privacy and Cookie Policy

11.15. Функция udp_connect

Наша функция udp_connect создает присоединенный сокет UDP.

#include "unp.h"

int udp_connect(const char *hostname, const char *service);

Возвращает; дескриптор присоединенного сокета в случае успешного выполнения, в случае ошибки ничего не возвращает

В случае присоединенного сокета UDP два последних аргумента, которые требовались в функции udp_client, больше не нужны. Вызывающий процесс может вызвать функцию write вместо sendto, таким образом нашей функции не нужно возвращать структуру адреса сокета и ее длину. В листинге 11.11 представлен исходный код.

Листинг 11.11. Функция udp_connect: создание присоединенного сокета UDP

//lib/udp_connect.c

 1 #include "unp.h"

 2 int

 3 udp_connect(const char *host, const char *serv)

 4 {

 5  int sockfd, n;

 6  struct addrinfo hints, *res, *ressave;

 7  bzero(&hints, sizeof(struct addrinfo));

 8  hints.ai_family = AF_UNSPEC;

 9  hints.ai_socktype = SOCK_DGRAM;

10  if ((n = getaddrinfo(host, serv, &hints, &res)) != 0)

11   err_quit("udp_connect error for %s, %s: %s",

12    host, serv, gai_strerror(n));

13  ressave = res;

14  do {

15   sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);

16   if (sockfd < 0)

17    continue; /* игнорируем этот адрес */

18   if (connect(sockfd, res->ai_addr, res->ai_addrlen) == 0)

19    break; /* успех */

20   Close(sockfd); /* игнорируем этот адрес */

21  } while ((res = res->ai_next) != NULL);

22  if (res == NULL) /* значение errno устанавливается при

                        последнем вызове функции connect() */

23  err_sys("udp_connect error for %s, %s", host, serv);

24  freeaddrinfo(ressave);

25  return (sockfd);

26 }

Эта функция почти идентична функции tcp_connect. Однако отличие в том, что при вызове функции connect для сокета UDP ничего не отправляется собеседнику. Если что-то не в порядке (собеседник недоступен или на заданном порте не запущен сервер), вызывающий процесс не обнаружит этого, пока не пошлет собеседнику дейтаграмму.

Данный текст является ознакомительным фрагментом.