Няшная / Говнокод #24655 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
https://docs.microsoft.com/en-us/windows/desktop/api/winsock/nf-winsock-wsaasyncselect
int WSAAsyncSelect(
  SOCKET s,
  HWND   hWnd,
  u_int  wMsg,
  long   lEvent
);

/*

hWnd

A handle that identifies the window that will receive a message when a network event occurs.
*/

Почему виндовые асинхронные (или правильно говорить "небликирующиеся") сокеты так черезжопно сделаны? Нафига им через HWND надо месседжи слать? Что, другого способа нет для оповещений?
Требовать для работы асинхронных сокетов чтоб какое-то окно было это как требовать зубную щетку для входа в туалет чтоб посрать

Запостил: j123123 j123123, (Updated )

Комментарии (16) RSS

  • Почему не сделали линупсе, чтоб для асинхронных сокетов надо было xlib использовать, и работающие иксы еще?
    Ответить
    • Потому что иксы сами через сокеты работают. Рекурсия получится.

      А ведь получились противоположные подходы:
      1. В Винде для работы асинхронных сокетов нужны окна.
      2. В X-Window для работы окон нужны сокеты.
      Ответить
    • И на сервере, который вообще без монитора, тоже нужно окошко искать?
      Ответить
  • > Нафига им через HWND надо месседжи слать?
    Лул, я задался этим же вопросом, когда впервые столкнулся с этой функцией. Ещё где-то накопал то ли особый класс окна, то ли функцию, которая создаёт окошко, у которого нет окошка, но есть hwnd.
    Это растёт, скорее всего, из тех дремучих времён, когда формочки получали месседжи от своих детей и в своём wndproc в огромном свитче всех их обрабатывали. Нужно получить пару байт из сети? Просто сделай свитч побольше.

    > Что, другого способа нет для оповещений?
    IOCP, он же в кишках boost::asio.
    Ответить
    • @Лул, я задался этим же вопросом, когда впервые столкнулся с этой функцией. Ещё где-то накопал то ли особый класс окна, то ли функцию, которая создаёт окошко, у которого нет окошка, но есть hwnd.

      В делфях она зовётся AllocateHwnd. Создаётся скрытое окошко 0x0, с классом TPUtilWindow.


      @Это растёт, скорее всего, из тех дремучих времён, когда формочки получали месседжи от своих детей и в своём wndproc в огромном свитче всех их обрабатывали.

      А что, сейчас разве что-то изменилось?
      Ответить
  • Сейчас глянем, что она делает:
    Socket = DSOCKET::GetCountedDSocketFromSocket(s);
            if(Socket != NULL){
                Provider = Socket->GetDProvider();
                ReturnValue = Provider->WSPAsyncSelect(
                    s,
                    hWnd,
                    wMsg,
                    lEvent,
                    &ErrorCode);
                Socket->DropDSocketReference();
                if (ReturnValue==ERROR_SUCCESS)
                    return ReturnValue;
                assert (ErrorCode!=NO_ERROR);
                if (ErrorCode==NO_ERROR)
                    ErrorCode = WSASYSCALLFAILURE;
            }
            else {
                ErrorCode = WSAENOTSOCK;
            }

    Она делегирует действия WSPAsyncSelect.
    Ответить
    • WSPAsyncSelect проверяет, действительно ли ей передали дескриптор окна:
      if ( !IsWindow( hWnd ) ) {
      
              err = WSAEINVAL;
              goto errorexit;
      
          }
      Ответить
      • Дескриптор окна упаковывается в какую-то структуру:
        //
            // Store the specified window handle, message, and event mask in
            // the socket information structure.
            //
        
            socket->AsyncSelecthWnd = hWnd;
            socket->AsyncSelectwMsg = wMsg;
            socket->AsyncSelectlEvent = lEvent;
            socket->DisabledAsyncSelectEvents = 0;
        Ответить
        • А шлют сообщение этому окну уже другие функции типа SockAsyncSelectCompletion:
          posted = (SockUpcallTable->lpWPUPostMessage)(
                               socket->AsyncSelecthWnd,
                               socket->AsyncSelectwMsg,
                               (WPARAM)socket->Handle,
                               WSAMAKESELECTREPLY( 0, error )
                               );
          Ответить
      • Ну тогда без вариантов. Надо создать окошко с классом STATIC, размер и видимость не имеют значения.
        Ответить
  • Дык эта функция просто для удобства добавлена. Нету окон -- не юзай.
    Ответить

Добавить комментарий

Я, guest, находясь в здравом уме и твердой памяти, торжественно заявляю:

    А не использовать ли нам bbcode?


    8