Einzelnen Beitrag anzeigen

Benutzerbild von Salomon
Salomon

Registriert seit: 9. Jun 2002
453 Beiträge
 
#1

Grundgerüst für Server (Win API)

  Alt 15. Nov 2002, 12:57
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] = 'Matrixthen
                 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
01001000 01100001 01101100 01101100 01101111
01010111 01100101 01101100 01110100 00100001

http://www.it-adviser.net
  Mit Zitat antworten Zitat