На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
    > WaitForMultipleObjects, SOCKET, stdin , Как мультиплексировать всё это? о_О
      Требуется мультиплексирование серверного сокета и стандартного потока ввода:
      Сервер-демон запускается, прислушивается к порту. Если приходит входящее соединение, то сервер для него создает поток и дальнейшая работа производится уже вне основного потока.
      Если получен ввод на консоль - завершить работу.
      Все действия должны предприниматься незамедлительно. Поэтому требуется мультиплексирование как сетевого сокета, так и стандартного потока ввода.
      В UNIX для этого обычно используется select. Однако в Windows функция select входит в состав библиотеки WinSock 2 и поддерживает мультиплексирование исключительно сетевых сокетов. После активного использования Google я нашел функцию WaitForMultipleObjects, которая поддерживает мультиплексирование консольного ввода вывода и событий. С помощью функции WSAEventSelect я создаю дескриптор, совместимый с событийным мультиплексором и сохраняю его в массив типа HANDLE[]. Туда же, на "соседнюю полочку", кладу дескриптор _fileno(stdin).

      WaitForMultipleObjects при этом возвращает WAIT_FAILED, GetLastError возвращает ERROR_INVALID_HANDLE. Причем если не добавлять _fileno(stdin), то всё работает прекрасно, однако с не меньшим успехом я мог бы воспользоваться и уже привычным мне select.

      Ну и код напоследок.
      ExpandedWrap disabled
        #include <stdio.h>
        #include <stdlib.h>
        #include <winsock2.h>
         
        int main(int argc, char *argv[], char **env){
            char *ip;
            DWORD wfmret;
            int cycle_accept;
            int port;
            HANDLE eventHandle;
            HANDLE wfm[2];
            SOCKET *s;
            WSADATA wsaData;
            struct sockaddr_in service;
         
            cycle_accept=0;
         
            ip=malloc(sizeof(char)*10);
            memset(ip,0,10);
            strncpy_s(ip,10,"127.0.0.1",10);
            port=91462;
         
            WSAStartup(MAKEWORD(2,2),&wsaData);
            s=malloc(sizeof(SOCKET));
            *s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
            service.sin_family=AF_INET;
            service.sin_addr.s_addr=inet_addr(ip);
            service.sin_port=htons(port);
            bind(*s,(SOCKADDR *)&service,sizeof(service));
            listen(*s,1);
         
            cycle_accept=1;
            while(cycle_accept==1){
                eventHandle=WSACreateEvent();
                WSAEventSelect(*s,eventHandle,FD_ACCEPT);
                wfm[0]=eventHandle;
                wfm[1]=_fileno(stdin);
                wfmret=WaitForMultipleObjects(2,wfm,FALSE,5000);
                WSACloseEvent(eventHandle);
                if(wfmret==-1){
                    printf("Error code %d\n",GetLastError());
                    getchar();
                    cycle_accept=0;
                }
            }
            shutdown(*s,SD_BOTH);
            closesocket(*s);
            free(ip);
            free(s);
            return 0;
        }
        Цитата Northsoft @
        Туда же, на "соседнюю полочку", кладу дескриптор _fileno(stdin).

        WaitForMultipleObjects при этом возвращает WAIT_FAILED, GetLastError возвращает ERROR_INVALID_HANDLE. Причем если не добавлять _fileno(stdin), то всё работает прекрасно, однако с не меньшим успехом я мог бы воспользоваться и уже привычным мне select.

        Цитата
        The WaitForMultipleObjects function can specify handles of any of the following object types in the lpHandles array:

        Change notification
        Console input
        Event
        Job
        Mutex
        Process
        Semaphore
        Thread
        Waitable timer


        Though available for other uses, the following objects can also be used for synchronization.

        Change notification Created by the FindFirstChangeNotification function, its state is set to signaled when a specified type of change occurs within a specified directory or directory tree. For more information, see File I/O.

        Console input Created when a console is created. The handle to console input is returned by the CreateFile function when CONIN$ is specified, or by the GetStdHandle function. Its state is set to signaled when there is unread input in the console's input buffer, and set to nonsignaled when the input buffer is empty. For more information about consoles, see Consoles and Character-Mode Support.

        Job Created by calling the CreateJobObject function. The state of a job object is set to signaled when all its processes are terminated because the specified end-of-job time limit has been exceeded. For more information about job objects, see Job Objects.

        Process Created by calling the CreateProcess function. Its state is set to nonsignaled while the process is running, and set to signaled when the process terminates. For more information about processes, see Processes and Threads.

        Thread Created when a new thread is created by calling the CreateProcess, CreateThread, or CreateRemoteThread function. Its state is set to nonsignaled while the thread is running, and set to signaled when the thread terminates. For more information about threads, see Processes and Threads.


        Добавлено
        короче, если я правильно понимаю и не туплю, то юзай WinAPI и будет тебе счастие а разбавлять WinAPI ( WSAEventSelect ) и CRT (_fileno(stdin)) имхо не верно.
        Сообщение отредактировано: progman -
          Цитата Northsoft @
          Туда же, на "соседнюю полочку", кладу дескриптор _fileno(stdin).
          Причем если не добавлять _fileno(stdin), то всё работает прекрасно

          Ес-но, т.к. это не виндовый дескриптор, а crt-шный = указателю на структуру FILE.
          Используй GetStdHandle
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0209 ]   [ 16 queries used ]   [ Generated: 27.04.24, 22:35 GMT ]