Реализация сокетов - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Товарищи, подскажите что да как с сокетами в Си. Ибо пытаюсь сам разобратся по статье из вики, компилятор не воспринимает #include <sys/socket.h> Может что есть почитать на эту тему поподробнее?) Вот сама статья : https://ru.wikipedia.org/wiki/%D0%A1...BA%D0%BB%D0%B8

Решение задачи: «Реализация сокетов»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <WinSock2.h>
#define PRINTNUSERS if (nclients)\
  printf("%d user on-line\n",nclients);\
  else printf("No User on line\n");
  int nclients = 0;
int main()
{
    int i_error=0;//переменная для проверки на ошибки
char buff[1024];
//настройка библиотеки Ws2_32.dll
    WSADATA WsaData;//определяем переменную
    i_error = WSAStartup (MAKEWORD(2,2), (WSADATA *) &buff[0]);//настраиваем
    if (i_error)//проверка на успешность настройки
    {
        printf("ERROR!\n");
    }
    else
    {
        printf("Biblioteka uspehno nastroena!\n");
    }
 
    //создание серверного сокета
    SOCKET s;//создаем прототип
    s = socket(AF_INET, SOCK_STREAM, 0);
    if(s==-1)
    {
        printf("ERROR!\n");
    }
    else
    {
        printf("Soket uspehno sozdan!\n");
    }
 
//Привязка к локальным именам
    struct sockaddr_in adr;//создаем протатип(addr), структуры sockaddr_in
    adr.sin_family=AF_INET;
    adr.sin_port=htons(3000);
    adr.sin_addr.s_addr=htonl(INADDR_ANY);//INADDR_ANY сервер работает НА машине, с любым ip
    i_error=0;//очистка переменной для ошибок
    i_error=bind (s,(SOCKADDR*) &adr, sizeof (adr));
    if(i_error==-1)
    {
        printf("ERROR! Soket ne sviazan c IP\n");
    }
    else
    {
        printf("Soket uspehno sviazan!\n");
    }
 
    //Инициализация процесса «прослушивания» порта
    printf("Inicializacia processa prosluhivania\n");
    if(listen (s,0x100 )){
       printf("Error listen %d\n",WSAGetLastError());
      closesocket(s);
      WSACleanup();
      return -1;
       }
       else{
        printf("Listen ok");
       }
 
 
//подключение клиента - Получение дескриптора клиентского соединения
 
    SOCKET ClientSock;
    struct sockaddr_in addr_klienta;
    int size_client_addr=sizeof(addr_klienta);
    while((ClientSock=accept(s,(SOCKADDR*)&addr_klienta,&size_client_addr))){
            nclients++;
 
      HOSTENT *hst;
      hst=gethostbyaddr((char *)
          &addr_klienta.sin_addr.s_addr,4, AF_INET);
 
      // вывод сведений о клиенте
      printf("+%s [%s] new connect!\n",
      (hst)?hst->h_name:"",
      inet_ntoa(addr_klienta.sin_addr));
      PRINTNUSERS
       DWORD thID;
 
 
    SOCKET my_sock;
    my_sock=((SOCKET *) ClientSock)[0];
    char buff[20*1024];
    #define sHELLO "Hello, Sailor\r\n"
 
    // отправляем клиенту приветствие
    send(my_sock,sHELLO,sizeof(sHELLO),0);
    int bytes_recv;
    while( (bytes_recv=
                 recv(my_sock,&buff[0],sizeof(buff),0))
              && bytes_recv !=SOCKET_ERROR)
      send(my_sock,&buff[0],bytes_recv,0);
    nclients--;
    printf("-disconnect\n"); PRINTNUSERS
    closesocket(my_sock);
 
    }
 
    return 0;
}

Объяснение кода листинга программы

  1. Объединение кода с постановкой задачи: Реализация сокетов.
  2. Описание переменных:
    • nclients - количество клиентов в онлайне;
    • i_error - переменная для проверки на ошибки;
    • buff - буфер для обмена данными;
    • s - сокет сервера;
    • adr - структура sockaddr_in для привязки к локальному имени;
    • ClientSock - сокет клиента;
    • addr_klienta - структура sockaddr_in для адреса клиента;
    • hst - структура hostent для получения имени хоста по IP;
    • my_sock - сокет для обмена данными с клиентом;
    • sHELLO - приветственное сообщение для отправки клиенту.
  3. Последовательность выполнения кода:
    1. Настройка библиотеки Ws2_32.dll и инициализация WSAData.
    2. Создание серверного сокета и его привязка к локальному имени.
    3. Инициализация процесса прослушивания порта.
    4. Принятие подключения клиента и увеличение счетчика клиентов.
    5. Получение имени хоста клиента и его IP-адреса.
    6. Отправка приветственного сообщения клиенту.
    7. В цикле получение данных от клиента и их отправка обратно.
    8. Уменьшение счетчика клиентов и закрытие соединения с клиентом.
    9. Повторение пункта 4 до прекращения работы сервера.
  4. Описание функций:
    • WSAStartup - настройка библиотеки Ws2_32.dll;
    • socket - создание серверного сокета;
    • bind - привязка сокета к локальному имени;
    • listen - инициализация процесса прослушивания порта;
    • accept - принятие подключения клиента;
    • gethostbyaddr - получение имени хоста по IP-адресу;
    • recv - получение данных от клиента;
    • send - отправка данных клиенту;
    • closesocket - закрытие сокета;
    • WSACleanup - очистка ресурсов, выделенных для работы с сокетами;
    • define - определение макроса для размера приветственного сообщения.

  5. Код содержит комментарии к каждой операции и проверку на ошибки.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.769 из 5
Похожие ответы