![]() |
Grundgerüst für Server (Win API)
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:
Mfg Salomon
// 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; |
Eventuell hilft das: Link entfernt (Programm existiert nicht mehr).
|
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 |
Hat den keiner eine Idee? :(
@Luckie: Hast du dir dein Programm nochmal angeschaut? Vielleicht findest du den Fehler ja dann. Wäre echt super. |
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.
|
Schade. Ich werde es schon irgendwie hinbekommen. Kann ja nicht so schwer sein.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:10 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz