AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Grundgerüst für Server (Win API)
Thema durchsuchen
Ansicht
Themen-Optionen

Grundgerüst für Server (Win API)

Ein Thema von Salomon · begonnen am 15. Nov 2002 · letzter Beitrag vom 16. Nov 2002
Antwort Antwort
Benutzerbild von Salomon
Salomon

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

Grundgerüst für Server (Win API)

  Alt 15. Nov 2002, 11: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
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2
  Alt 15. Nov 2002, 12:28
Eventuell hilft das: Link entfernt (Programm existiert nicht mehr).
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Salomon
Salomon

Registriert seit: 9. Jun 2002
453 Beiträge
 
#3
  Alt 15. Nov 2002, 12:37
Hehe, eher nicht. Denn dein Programm hat den selben Fehler. Ebenfalls nur eine Verbindung möglich, ein erneutes Verbinden unmöglich.

Ich habe mir schon einige Tutorials durchgelesen, finde aber die Fehlerquelle nicht.
Evtl. kannst du dir dein Programm ja auch nochmal anschauen

Mfg Salomon
01001000 01100001 01101100 01101100 01101111
01010111 01100101 01101100 01110100 00100001

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

Registriert seit: 9. Jun 2002
453 Beiträge
 
#4
  Alt 16. Nov 2002, 11:25
Hat den keiner eine Idee?

@Luckie: Hast du dir dein Programm nochmal angeschaut? Vielleicht findest du den Fehler ja dann. Wäre echt super.
01001000 01100001 01101100 01101100 01101111
01010111 01100101 01101100 01110100 00100001

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

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5
  Alt 16. Nov 2002, 11:29
Nö. das war eh nur eien Studie. Ihc wollte mal sehen, wie es die API macht, was also hinter den Komponenten steckt. Sollte nie was richtiges draus werden. Den Code habe ich ein halbes Jahr auch schon nicht mehr angefaßt oder reingekuckt.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Salomon
Salomon

Registriert seit: 9. Jun 2002
453 Beiträge
 
#6
  Alt 16. Nov 2002, 12:08
Schade. Ich werde es schon irgendwie hinbekommen. Kann ja nicht so schwer sein.
01001000 01100001 01101100 01101100 01101111
01010111 01100101 01101100 01110100 00100001

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


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:04 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz