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