WINSOCK + WINAPI - Okno nie odpowiada po podłączeniu się klienta

0

Witam. Pisze prostą aplikacje serwerową w WinAPI + WinSock. Kod w którym inicjalizuje gniazdko (transmisja asynchroniczna) wygląda następująco:

  procedure InitSockets;
  var
      ErrorCode: Integer;
  begin
    Writeln('Init [SOCKETS]..');

    //fill Server Socket Properties
    with SERVER_SOCKET_INFO do
      begin
      sin_family:=AF_INET;
      sin_addr.s_addr := INADDR_ANY;
      sin_port := htons(CFG_SERVER_PORT);
      end;

    //Initialize WSA...
    ErrorCode:=WSAStartup(MAKEWORD(2, 0), WSA);
    if ErrorCode = SOCKET_ERROR then
        begin
          MessageBox(MAIN_WINDOW, 'Unable to initialize WinSock! :(', 'WinSock Error', MB_ICONERROR);
          PostQuitMessage(0);
          Exit;
        end;

    //Setup ServerSocket
    SERVER_SOCKET:=Socket(AF_INET, SOCK_STREAM, 0);
    if SERVER_SOCKET=INVALID_SOCKET then
        begin
          MessageBox(MAIN_WINDOW, 'Unable to setup server socket! :(', 'WinSock Error', MB_ICONERROR);
          PostQuitMessage(0);
          Exit;
        end;

    //Bind Server Socket
    ErrorCode:=Bind(SERVER_SOCKET, SERVER_SOCKET_INFO, SizeOf(SERVER_SOCKET_INFO));
    if ErrorCode=SOCKET_ERROR then
        begin
          MessageBox(MAIN_WINDOW, 'Unable to bind server socket! :(', 'WinSock Error', MB_ICONERROR);
          PostQuitMessage(0);
          Exit;
        end;

    //Start to listen
    ErrorCode:=Listen(SERVER_SOCKET, SOMAXCONN);
    if ErrorCode=SOCKET_ERROR then
        begin
          MessageBox(MAIN_WINDOW, 'Unable to start server socket! :(', 'WinSock Error', MB_ICONERROR);
          PostQuitMessage(0);
          Exit;
        end;

    //Enable Asynchrous Socket
    WSAAsyncSelect(SERVER_SOCKET, MAIN_WINDOW, WM_USER, FD_ACCEPT or FD_READ or FD_CONNECT);
  end;

Procedurę ta wywołuje w odpowiedzi na komunikat WM_CREATE tworzonego okna programu. Gniazdko (teoretycznie) startuje, nie otrzymuje żadnych błędów jednak coś jest nie tak, bo forma przestaje reagować na komunikaty w momencie połączenia się klienta. Procedura obsługi okna wygląda następująco:

  function WndProc(Wnd: HWND; uMsg: UINT; wPar: WPARAM; lPar: LPARAM): LRESULT; stdcall;
  begin

  Result := 0;
  case uMsg of

    //OnMakeWindow
    WM_CREATE:
              begin
              InitConfig;
              InitSockets;
              end;


    FD_CONNECT:
              begin
                ACCEPT_SOCKET:=Accept(SERVER_SOCKET, nil, nil);
                Writeln('Connected ;-)');
              end;

    //OnSomeAction
    WM_COMMAND:
              begin
                if wPar = 300 then
                    begin
                      MessageBox(MAIN_WINDOW, 'Ouch! You tapped me!', 'That button says: ', MB_ICONINFORMATION);
                    end;
              end;
              
    //OnWindowClose
    WM_DESTROY:
              begin
              FreeSockets;
              PostQuitMessage(0);
              end;

    //Default..
    else Result := DefWindowProc(Wnd, uMsg, wPar, lPar);
  end;

Co może być nie tak? Dziękuje z góry za pomoc

1

Co do samej obsługi komunikatów to coś tu nie halo. Powinieneś odebrać WM_USER (taki podałeś jako parametr funkcji WSAAsyncSelect) i z lParam tego komunikatu pobierać i obsługiwać zdarzenia które chcesz (czyli min. to nieszczęsne FD_CONNECT) a więc:

   WM_USER:
       case WSAGETSELECTEVENT(lPar) of
           FD_CONNECT: //...
       end;
    //....

1 użytkowników online, w tym zalogowanych: 0, gości: 1