Интернет магазин китайских планшетных компьютеров



Компьютеры - Сокеты Беркли - Пример клиента и сервера, использующие UDP

23 января 2011


Оглавление:
1. Сокеты Беркли
2. Интерфейс сокета Беркли
3. Заголовочные файлы
4. Функции
5. Дополнительные параметры для сокетов
6. Передача данных
7. Пример клиента и сервера, использующих TCP
8. Пример клиента и сервера, использующие UDP



UDP основывается на протоколе без установления соединений, то есть протокол, не гарантирующий доставку информации. UDP-пакеты могут приходить не в указанном порядке, дублироваться и приходить более одного раза, или даже не доходить до адресата вовсе. Из-за этих минимальных гарантий, UDP значительно уступает протоколу TCP. Отсутствие установки соединений означает отсутствие потоков или соединений между двумя хостами, так как вместо этого данные прибывают в датаграммах.

Адресное пространство UDP, область номеров UDP-портов полностью отделены от TCP-портов.

Сервер

Код может создавать UDP-сервер на порту 7654 следующим образом:

int sock = socket;
 
struct sockaddr_in sa;
int bound;
ssize_t recsize;
socklen_t *address_len=NULL;
 
sa.sin_addr.s_addr = INADDR_ANY;
sa.sin_port = htons;
 
bound = bind&sa, sizeof );
 
if 
  fprintf: ошибка %s\n", strerror );

bind связывает сокет с парой адрес/порт.

while
  {
    printf;
    recsize = recvfromHz, 100, 0, &sa, address_len );
 
    if 
      fprintf );
 
    printf;
    sleep;
    printf;
  }

Такой бесконечный цикл получает все UDP-датаграммы, приходящие на порт 7654, при помощи recvfrom. Функция использует параметры:

  • сокет
  • указатель на буфер данных
  • размер буфера
  • флаги
  • адресная структура отправителя
  • длина адресной структуры отправителя.

Клиент

Простейшая демонстрация отправки UDP-пакета, содержащего «Привет!» на адрес 127.0.0.1 порт 7654 выглядит примерно так:

#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <unistd.h> /* для вызова close для сокета */
 
int main
  {
    int sock;
    struct sockaddr_in sa;
    int bytes_sent;
    const char* buffer = "Привет!";
    int buffer_length;
 
    buffer_length = strlen + 1;
 
    sock = socket;
 
    if 
      {
         printf;
         return 0;
      }
 
    sa.sin_family = PF_INET;
    sa.sin_addr.s_addr = htonl;
    sa.sin_port = htons;
 
    bytes_sent =
      sendto(
        sock,
        buffer,
        strlen + 1,
        0,
        &sa,
        sizeof
      );
 
    if 
      printf );
 
    close;
    return 0;
  }


Просмотров: 8615


<<< Расширение X video
Список Java API >>>