Прокомментировать код ECHO Server - C (СИ)

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

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

Мне нужно написать ECHO Server,(только его клиента не надо) который будет из командной строки брать номер порта и конектится к нему и слушать все что есть. Если порт занят, то вывести сообщение на экран и пойти перебирать порты (допустим от 50000 до 55000). Я нашел код такого сервера, но есть непонятные места, объясните их пожалуйста. Да чуть не забыл пишу для unix
# include <sys/types.h>
# include <sys/socket.h>
# include <stdio.h>
 
int main ()
{
    int sock, listener;
    struct sockaddr_in addr; # зачем нужна структура?
    char buf[1024];
    int bytes_read;
    
    listener = socket(AF_INET, SOCK_STREAM, 0);
    if (listener<0)
    {
        perror("socket");
        exit(1);
    }
    
    addr.sin_family = AF_INET; 
    addr.sin_port = htons(55000); # что означает htons.  а цифра внутри это как раз номер порта?
    addr.sin_addr.s_addr = htonl(INADDR_ANY); # эту строчку не понял целиком
 
    if (bind(listener, (struct socaddr *)&addr, sizeof(addr))<0) # былобы хорошо и тут объяснить что к чему
    {
        perror("bind");
        exit(2);
    }
    
    listen(listener, 1);
    
    while (1)
    {
        sock=accept(listener, NULL, NULL); # эту тоже
        if (sock<0)
        {
            perror("accept");
            exit(3);
        }
        
        while (1)
        {
            bytes_read = recv(sock, buf, 1024,0);
            if (bytes_read<=0) break;
            printf("%c", bytes_read);
        }
        close (sock);
    }
    
    return 0;
}
И как организовать проверку занятости порта? И как увидеть, что он реально принимает данные с порта? Если скомпилить этот код, то он компилится и даже потом запускается но все время пишет port is already is used Спасибо за понимание

Решение задачи: «Прокомментировать код ECHO Server»

textual
Листинг программы
FD_ZERO (&rset);
FD_SET (listener, &rset);
select (listener + 1, &rset, NULL, NULL, &tm);

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

  1. FD_ZERO (&rset); - В этом коде используется функция FD_ZERO, которая инициализирует набор файловых дескрипторов (file descriptor set) с нулевыми значениями. Переменная rset содержит этот набор.
  2. FD_SET (listener, &rset); - Здесь используется функция FD_SET, которая добавляет файловый дескриптор listener в набор rset.
  3. select (listener + 1, &rset, NULL, NULL, &tm); - Это вызов функции select. Функция select ожидает, пока не появятся действия для хотя бы одного из файловых дескрипторов в наборе rset. Параметр listener + 1 передается в качестве первого аргумента, потому что функции FD_SET и FD_ISSET работают с индексами, начинающимися с 1. В этом случае listener - это файловый дескриптор, который прослушивает входящие соединения. Таким образом, в этом коде происходит следующее:
  4. Инициализация набора файловых дескрипторов с нулевыми значениями.
  5. Добавление файлового дескриптора listener в набор.
  6. Ожидание появления действия для файлового дескриптора listener (в данном случае, прослушивание входящих соединений).

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


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

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

10   голосов , оценка 3.8 из 5