Читать книгу 📗 "Основы программирования в Linux - Мэтью Нейл"
int main() { int server_sockfd, client_sockfd; int server_len, client_len; struct sockaddr_in server_address; struct sockaddr_in client_address; int result; fd_set readfds, testfds;2. Создайте сокет для сервера и присвойте ему имя:
server_sockfd = socket(AF_INET, SOCK_STREAM, 0); server_address.sin_family = AF_INET; server_address.sin_addr.s_addr = htonl(INADDR_ANY); server_address.sin_port = htons(9734); server_len = sizeof(server_address); bind(serversockfd, (struct sockaddr *)&server_address, server_len);3. Создайте очередь запросов на соединение и инициализируйте множество
readfdsserver_sockfd listen(server_sockfd, 5); FD_ZERO(&readfds); FD_SET(server_sockfd, &readfds);4. Теперь ждите запросы от клиентов. Поскольку вы передали пустой указатель как параметр
timeoutselect while(1) { char ch; int fd; int nread; testfds = readfds; printf("server waitingn"); result = select(FD_SETSIZE, &testfds, (fd_set *)0, (fd_set *)0, (struct timeval *)0); if (result < 1) { perror("server5"); exit(1); }5. После того как вы определили, что есть активность, можно выяснить, какой из дескрипторов активен, проверяя каждый из них по очереди с помощью макроса
FD_ISSET for (fd = 0; fd < FD_SETSIZE; fd++) { if (FD_ISSET(fd, &testfds)) {6. Если зафиксирована активность на
server_sockfdclient_sockfd if (fd == server_sockfd) { client_len = sizeof(client_address); client_sockfd = accept(server_sockfd, (struct sockaddr*)&client_address, &client_len); FD_SET(client_sockfd, &readfds); printf("adding client on fd %dn", client_sockfd); }Если активен не сервер, значит, активность проявляет клиент. Если получен
close else { ioctl(fd, FIONREAD, &nread); if (nread == 0) { close(fd); FD_CLR(fd, &readfds); printf("removing client on fd %dn", fd); } else { read(fd, &ch, 1); sleep(5); printf("serving client on fd %dn", fd); ch++; write(fd, &ch, 1); } } } } }}Примечание
В реальную программу было бы неплохо вставить переменную, содержащую наибольший подключенный номер
fdfdfdПри запуске этой версии сервера многочисленные клиенты будут обрабатываться последовательно в единственном процессе.
$ <b>./server5 &</b>[1] 26686server waiting$ <b>./client3 & ./client3 & ./client3 & ps x</b>[2] 26689[3] 26690adding client on fd 4server waiting[4] 26691PID TTY STAT TIME COMMAND26686 pts/1 S 0:00 ./server526689 pts/1 S 0:00 ./client326690 pts/1 S 0:00 ./client326691 pts/1 S 0:00 ./client326692 pts/1 R+ 0:00 ps x$ serving client on fd 4server waitingadding client on fd 5server waitingadding client on fd 6char from server = Вserving client on fd 5server waitingremoving client on fd 4