Прокомментировать код ECHO Server - C (СИ)
Формулировка задачи:
Мне нужно написать ECHO Server,(только его клиента не надо) который будет из командной строки брать номер порта и конектится к нему и слушать все что есть.
Если порт занят, то вывести сообщение на экран и пойти перебирать порты (допустим от 50000 до 55000).
Я нашел код такого сервера, но есть непонятные места, объясните их пожалуйста. Да чуть не забыл пишу для unix
И как организовать проверку занятости порта?
И как увидеть, что он реально принимает данные с порта?
Если скомпилить этот код, то он компилится и даже потом запускается но все время пишет port is already is used
Спасибо за понимание
# 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; }
Решение задачи: «Прокомментировать код ECHO Server»
textual
Листинг программы
FD_ZERO (&rset); FD_SET (listener, &rset); select (listener + 1, &rset, NULL, NULL, &tm);
Объяснение кода листинга программы
FD_ZERO (&rset);
- В этом коде используется функция FD_ZERO, которая инициализирует набор файловых дескрипторов (file descriptor set) с нулевыми значениями. Переменнаяrset
содержит этот набор.FD_SET (listener, &rset);
- Здесь используется функция FD_SET, которая добавляет файловый дескрипторlistener
в наборrset
.select (listener + 1, &rset, NULL, NULL, &tm);
- Это вызов функции select. Функция select ожидает, пока не появятся действия для хотя бы одного из файловых дескрипторов в набореrset
. Параметрlistener + 1
передается в качестве первого аргумента, потому что функции FD_SET и FD_ISSET работают с индексами, начинающимися с 1. В этом случаеlistener
- это файловый дескриптор, который прослушивает входящие соединения. Таким образом, в этом коде происходит следующее:- Инициализация набора файловых дескрипторов с нулевыми значениями.
- Добавление файлового дескриптора
listener
в набор. - Ожидание появления действия для файлового дескриптора
listener
(в данном случае, прослушивание входящих соединений).
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д