Книга: TCP/IP Архитектура, протоколы, реализация (включая IP версии 6 и IP Security)

21.10 Программа сервера UDP

Показанная ниже программа создает socket для UDP, связывает вызов с портом, а затем получает и распечатывает сообщения, которые посылаются на этот порт:

/* udpserv.c
 * Для запуска программы ввести "udpserv".
 *
 * Сначала включить стандартные заголовочные файлы. */
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <netdb.h>
#include <errno.h>
#define BUFLEN 81
main() {
 int sockMain, addrLength, msgLength;
 struct sockaddr_in servAddr, clientAddr;
 char buf[BUFLEN];
 /* 1. Создать socket для UDP. */
 if ((sockMain = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
  perror("Сервер не может открыть socket для UDP.");
  exit(1);
 }
 /* 2. Ввести информацию в структуру данных, используемую для хранения локальных
  * IP-адресов и порта. Возложить на bind получение свободных портов. */
 bzero((char *)&servAddr, sizeof(servAddr));
 servAddr.sin_family = AF_INET;
 servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
 servAddr.sin_port = 0;
 /* 3. Вызвать bind, которая запишет номер используемого порта
  * в TCB. */
 if (bind(sockMain, &servAddr, sizeof(servAddr))) {
  perror("Вызов bind от сервера неудачен.");
  exit(1);
 }
 /* 4. Извлекаем номер порта и используем функцию
  * getsockname() для копирования порта в servAddr. */
 addrLength = sizeof(servAddr);
 if ( getsockname(sockMain, &servAddr, &addrLength)) {
  perror(Вызов getsockname неудачен.");
  exit(1);
 }
 printf("SERVER: Номер порта is %dn", ntohs(servAddr.sin_port));
 /* 5. Бесконечный цикл ожидания сообщений от клиентов. */
 for (;;) {
  addrLength = sizeof(clientAddr);
  bzero(buf, BUFLEN);
  if ((msgLength = recvfrom(sockMain, buf, BUFLEN, 0, &clientAddr, &addrLength)) < 0) {
   perror("Плохой socket клиента.");
   exit(1);
  }
  /* 6. Распечатать клиентские IP-адрес и порт вместе с сообщением. */
  printf("SERVER: IP-адрес клиента: %sn",
   inet_ntoa(clientAddr.sin_addr));
  printf("SERVER: Порт клиента: %dn",
   ntohs(clientAddr.sin_port));
  printf("SERVER: Длина сообщения %dn", msgLength);
  printf("SERVER: Сообщение: %snn", buf);
 }
}

Оглавление книги

Оглавление статьи/книги

Генерация: 1.398. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз