Hallo,
ich habe mittels der
WinAPI das Grundgerüst eines Servers erstellt. Allerdings gibt es dabei noch ein paar Probleme. Wenn ich den "Accept" Part nicht in die unendliche While Schleife packe, kann ich mich einmal verbinden und alles klapt. Versuche ich mich ein weiteres mal zu verbinden, reagiert der Server nicht mehr und die CPU AUslastung steigt auf nahezu 100%.
Wenn ich den "Accept" Part mit in die Schleife packe, kann ich mich zwar mehrmals zum Server verbinden, er scheint die Anfragen aber nicht mehr zu verarbeiten.
Also Frage 1: Was stimmt an meiner Server implementation nicht, und wie bekomme ich es hin, das ich mich auch mehrmals hintereinander verbinden kann?
2: Wie bekomme ich den Server MultiUser fähig, also so, dass mehrer Benutzer gleichzeitig darauf zugreifen können. Das funktioniert irgendwie mit Threads. Die User müssen dann irgendwie glaube ich an einer ID verwaltet werden. Weiß jemand wie das geht?
Hier nun das Server Grundgerüst:
Delphi-Quellcode:
// Dieser Teil wird im WM Create aufgerufen
if (WSAStartup(MAKEWORD(2,0),wsa)) <> 0 then
messageout('Could not initialize Winsock!!!') else
messageout ('Winsock initialized...');
acceptSock := Socket(AF_INET, SOCK_STREAM, 0);
if acceptSock = INVALID_SOCKET then
messageout('Could not create Socket!!!') else
messageout('Socket created...');
ZeroMemory(@sa, sizeof(sa));
sa.sin_addr.S_addr := INADDR_ANY;
sa.sin_family := AF_INET;
sa.sin_port := htons(12345); // PORT
if (bind(acceptSock, sa, sizeof(sa))) = SOCKET_ERROR then
messageout ('Could not "bind" Socket') else
messageout('Socket "bind" on Port 12345 ...');
if (listen(acceptSock, 10)) = SOCKET_ERROR then
messageout ('Could not set Socket to "listen" Mode!!!') else
messageout ('Socket set to "listen" Mode...');
hThread := CreateThread(nil, 0, @RecvThread, nil, 0, t);
if hThread <> 0 then bThreadRunning := TRUE;
Delphi-Quellcode:
// Und so sieht der RecvThread aus (gekürzt)
function RecvThread(p: Pointer): DWORD; stdcall;
begin
conSock := accept(acceptSock, nil, nil);
if conSock = INVALID_SOCKET then
messageout ('Could not "accept" new Connection!!!')else
messageout ('New Connection established...');
while bThreadRunning do
begin
ZeroMemory(@szRecv, sizeof(szRecv));
recv(conSock, szRecv, sizeof(szRecv), 0);
if lstrlen(szRecv) > 0
then
begin
cmd[0] := ''; //cmd[0] = Eingehendes Command als String
SetString(cmd[0], szRecv, StrLen(szRecv));
Case int_com (cmd[0]) of
0 : {Password}
begin
if cmd[2] = 'Matrix' then
begin
authtentification := true;
SendString ('Server Password Correct...');
end
else
SendString ('Password needed or Wrong!');
end;
1 :
begin
//...
end;
2 :
begin
//...
end;
end; // Case end
end; // lstrlen(szRecv) > 0 end
end; // While end
result := 0;
end;
Mfg Salomon