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



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

23 января 2011


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



TCP реализует концепцию соединения. Процесс создает TCP-сокет вызовом функции socket с параметрами PF_INET или PF_INET6, а также SOCK_STREAM и IPPROTO_TCP.

Сервер

Создание простейшего TCP-сервера состоит из следующих шагов:

  • Создание TCP-сокетов вызовом функции socket.
  • Привязывание сокета к прослушиваемому порту вызовом функции bind. Перед вызовом bind программист должен объявить структуру sockaddr_in, очистить ее), затем sin_family и заполнить поля sin_port. Преобразование short int в порядок байтов может быть выполнено при помощи вызова функции htons.
  • Подготовка сокета к прослушиванию на предмет соединений при помощи вызова listen.
  • Принятие входящих соединений через вызов accept. Это блокирует сокет до получения входящего соединения, после чего возвращает дескриптор сокета для принятого соединения. Первоначальный дескриптор остается прослушиваемым дескриптором, а accept может быть вызван вновь для этого сокета в любое время.
  • Соединение с удаленным хостом, которое может быть создано при помощи send и recv или write и read.
  • Итоговое закрытие каждого открытого сокета, который больше не нужен, происходит при помощи close. Необходимо отметить, что если были любые вызовы fork, то каждый процесс должен закрыть известные ему сокеты, а кроме того, два процесса не должны использовать один и тот же сокет в одно время.
/* Код сервера на языке Си */
 
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
 
int main
  {
    struct sockaddr_in stSockAddr;
    int i32SocketFD = socket;
 
    if 
      {
        perror;
        exit;
      }
 
    memset );
 
    stSockAddr.sin_family = PF_INET;
    stSockAddr.sin_port = htons;
    stSockAddr.sin_addr.s_addr = INADDR_ANY;
 
    if (
      bind(
        i32SocketFD,
        &stSockAddr, /* зачем приведение типа?: нужно, но а не void  */
        sizeof
      ) == -1
    )
      {
        perror;
 
      CloseSocketAndExitWithFailure:
        close;
        exit;
      }
 
    if  == -1 )
      {
        perror;
        goto CloseSocketAndExitWithFailure;
      }
 
    for
      {
        int i32ConnectFD = accept;
 
        if 
          {
            perror;
            close; /* нужно ли закрывать сокет после ошибки? */
            goto CloseSocketAndExitWithFailure;
          }
 
        /* выполнение операций чтения и записи ... */
 
        shutdown;
 
        close;
      }
 
    return 0;
  }

Клиент

Создание TCP-клиента происходит следующим образом:

  • Создание TCP-сокета вызовом socket.
  • Соединение с сервером при помощи connect, передача структуры sockaddr_in с sin_family с указанными PF_INET или PF_INET6, sin_port для указания порта прослушивания, и sin_addr для указания IPv4 или IPv6 адреса прослушиваемого сервера.
  • Взаимодействие с сервером при помощи send и recv или write и read.
  • Завершение соединения и сброс информации при вызове close. Аналогично, если были какие-либо вызовы fork, каждый процесс должен закрыть) сокет.
/* Код клиента на языке Си */
 
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
 
int main
  {
    struct sockaddr_in stSockAddr;
    int i32Res;
    int i32SocketFD = socket;
 
    if 
      {
        perror;
        exit;
      }
 
    memset );
 
    stSockAddr.sin_family = PF_INET;
    stSockAddr.sin_port = htons;
    i32Res = inet_pton;
 
    if 
      {
        perror;
      CloseSocketAndExitWithFailure:
        close;
        exit;
      }
    else
      if 
        {
          perror;
          goto CloseSocketAndExitWithFailure;
        }
 
    if (
      connect(
        i32SocketFD,
        &stSockAddr, /* зачем приведение типа? */
        sizeof
      ) == -1
    )
      {
        perror;
        goto CloseSocketAndExitWithFailure;
      }
 
    /* выполнение операций чтения и записи ... */
 
    shutdown;
 
    close;
    return 0;
  }


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


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