С & select, PxeL, 14-Ноя-09, 16:15 [смотреть все]Доброго всем! Прошу cориентировать, может, не в сложном вопросе, но 4 книги (уже), как об стенку Пишу программу - линейно работает, пытаюсь сделать много клиентной. Коментариями прописываю, что и как я понимаю - прошу поправить если не так.
int main(int argc, char *argv[]) { ... int server_sockfd, client_sockfd; ... listen (server_sockfd, 5); int count = 0 ; fd_set set, tset; struct timeval timeout={2,0};
FD_ZERO (&set); //обнуляю set FD_SET(server_sockfd, &set); //ввожу в set while(1){ / timeout.tv_sec = 1; timeout.tv_usec = 1; count = select (server_sockfd, &set, 0, 0, &timeout); //если select фиксирует изменения в сокете или в сет, то должно count получить что то. if (count > 0) { if (FD_ISSET (server_sockfd, &set) > 0) // смотрю на серверный сокет { ... client_sockfd = accept(...); printf("%s:%d\n", inet_ntoa(client_address.sin_addr) , ntohs(client_address.sin_port)); FD_SET (client_sockfd, &set); // ввожу нового клиента в set } for (client_sockfd = 0; client_sockfd < server_sockfd; ++server_sockfd) // перебираю клиентов if(client_sockfd != server_sockfd && FD_ISSET(client_sockfd, &set)) // если клиента нужно обслужить if (read_pack(&client_sockfd)>0) //просто выплевыает в терминал { (void) close (client_sockfd); // закрываю сокет FD_CLR (client_sockfd, &set); // убираю сокет с set } ;} printf("select: %d\n",count); // что бы увидить состояние ;}
И не вижу изменения состояния select в результате
|
- С & select, PxeL, 18:11 , 14-Ноя-09 (1)
результаты select (server_sockfd , &set, 0, 0, &timeout); и FD_ISSET (server_sockfd, &set) всегда равны нулю кажется все инклюды есть: #include <sys/types.h> #include <sys/socket.h> #include <sys/time.h> #include <stdio.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <math.h>
- С & select, Aesthetus Animus, 19:21 , 14-Ноя-09 (2)
- С & select, Гулевич А.И., 21:57 , 14-Ноя-09 (3)
- С & select, PxeL, 15:23 , 15-Ноя-09 (4)
FD_SET(server_sockfd, &set); это означает, что значение! номера server_sockfd попадает в структуру FD_SET под именем set, тогда смысл после accept делать FD_SET (client_sockfd, &set), ведь этот индекс уже в структуре?count = select (n+1, &set, ... делает проверку на чтение - т.е. сюда попадает и пришедшие новые соединения и пришедшие пакеты на существующие соединения. а при переборе вызывается if (FD_ISSET (i, &set) > 0). Тогда получается что нужно вести учет какие индексы портов (дескрипторы, как если я правильно понимаю термин) уже подключены и делать проверку соответственную. Я понимаю, что ядро само устанавливает "линк" дескриптора порта в прогамме к самому порту. А индекс дескрипторов - единый, тоесть если я создам с прогаммы соединение, то дескриптор клиентского порта при переборе будет мешать мне без собственной индексации (где буду знать, что подклчать, что читать, а что закрыть) Спасибо за ответы. Каждый новый ответ пророждает уйму новых вопросов :)
- С & select, PxeL, 19:48 , 16-Ноя-09 (5)
Такое ощущение, что вся русскоязычная литература - кастрирована. толь редакторами, толь переводчиками... а может и сами авторы пишут, сами не знают о чем, т.к. ошибок и противоречий уйма... Может ктонить разтолковать как распределяются дескрипторы сокетов? и как с ними правильно оперировать в селекте? человеческим русским языком.
- С & select, jd, 16:50 , 18-Ноя-09 (6)
- С & select, PxeL, 20:18 , 18-Ноя-09 (7)
1. серверный сокет (принимающий на акцепт) - он всегда один, по сле определения биндом ( нашел более менее толковую книгу). 2. сокет приняты акцептом после проверки на чтение говорит, что есть чтение, но реально при попытке вычитать операция рид возвращает -1. В талмуте оговорено, что возможно RST, но как от него избавиться? т.к. оно почему-то всегда происходит. 3. Ну что, нельзя было сказать сразу, что направильно думаешь, что на акцепт просматривать нужно только 1 сокет... и т.п. могу привести почти с десяток книг, где авторы дают описания этой функции "как кот наплакал" - неичего не описывая, и только пару слов о какойнеть одной особенности, а судя по примерам, можно сказать, что вообще не соображают что демонстрируют. А на форуме, хоть пассатижами выжимай.
- С & select, jd, 02:48 , 19-Ноя-09 (8)
- С & select, PxeL, 22:18 , 19-Ноя-09 (9)
Спасибо, за "своевременные" советы! когда уже на семисотой странице :)))
|