Server programmieren der mit mehreren Hundertausend Clienten klar kommt, Ideen?
-
Surkevin schrieb:
hier wahrscheinlich:
WSAAsyncSelect(listenSocket, hwnd, WM_NOTIFY_SOCKET, FD_READ | FD_WRITE | FD_CONNECT | FD_ACCEPT);WSASyncSelect gibts aber nicht
Kevinlese ich da hwnd?
das klingt nach nem window, das messages eschickt kriegen soll. besser isses, ein event zu nehmen, auf das man mit WaitForSingleObject warten kann!aber wichtiger: wozu select? mach doch einfach synchrones lesen!
-
Surkevin schrieb:
Wie schalt ich den WSA denn Synchron?
hab keinen demo-code mehr auf meiner platte.
zeig am besten mal deinen und jemand wird schon sehen, warum der socket asynchron ist.
-
ok...wie gesagt ich denk es liegt am WSAAsyncSelect...aber wie krieg ich sonst die Messages dass ein Client connecten will? Ok...vielleicht nen acceptThread, der ja auch blockt...ma testen

ZeroMemory(&wsaData, sizeof(WSADATA)); WORD wVersion = MAKEWORD(2, 0); WSAStartup(wVersion, &wsaData); listenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(!listenSocket) return FALSE; ZeroMemory(&sockadr, sizeof(SOCKADDR_IN)); sockadr.sin_family = AF_INET; sockadr.sin_port = htons(2323); sockadr.sin_addr.s_addr = INADDR_ANY; bind(listenSocket, (LPSOCKADDR)&sockadr, sizeof(SOCKADDR_IN)); listen(listenSocket, 1);//SOMAXCONN); WSAAsyncSelect(listenSocket, hwnd, WM_NOTIFY_SOCKET, FD_READ | FD_WRITE | FD_CONNECT | FD_ACCEPT);Kevin
/edit:
Mit dem Acceptthread funktionierts!! Kann mir bitte mal wer sagen wo die Unterschiede zwischen synchronen Sockets und asynchronen Sockets liegen? Danke
Kevin
-
Ist damit nich dasselbe wie blocking bzw. non-blocking sockets ?
blocking socket: Beispielsweise recv() wartet dann solange bis nen timeout eintritt (standardmäßig bei win glaube ich über ne Minute...) wenn keine Daten ankommen
Bei nem non-blocking socket würde recv() wenn keine Daten ankommen sofort mit dem Fehler WSAEWOULDBLOCK zurückkehren.
Bei ersterem wäre der Thread erstmal blockiert, bei zweiterem nicht.Umschalten zwischen blocking und non-blocking:
unsigned long nonblocking; nonblocking=1; // Bei ungleich 0 wird der Socket auf non-blocking geschaltet. ioctlsocket(nenSocket,FIONBIO,&nonblocking);Bei Verwendung von WSAAsyncSelect() wird der Socket automatisch in den non-blocking Modus gesetzt und man bekommt eben nette Nachrichten sobald bei nem Socket was passiert

-
kann man auch blocking mit den messages benutzen?
-
Surkevin schrieb:
kann man auch blocking mit den messages benutzen?
das wäre unfug.
bei blcking (==synchron) wartet recv einfach so lange, bis was zu lesen da ist.
bei nonblocking (==asyncron) wartet recv nicht, du kannst fein was anderes machen. aber mußt immer nachgucken ob messages kommen oder mußt auf ein event warten. und das nur, um bei ner message/event dann doch recv aufzurufen.
du solltest blocking verwenden. es ist ja auch voll ok, daß der thread geblockt ist, solange er auf daten wartet. die anderen threads laufen ja weiter, wenn sie wollen.
-
ok dann danke ich euch mal

-
noch was zum lesen:
Meep Meep
-
ich hab keine ahnung, was du im endeffekt anstellen willst...
der eine edonkey server bedient 500k-800k leute und hat 12 gig ram.
ich denke mal, da wird was mit raw sockets gemacht und die zuordnung der verbindungen vom programm selbst gelöst. also ip und port je endpunkt.
-
Wie haste denn den Thread noch ausgegraben? Das Programm wurde schon vor langer Zeit fertiggestellt
Danke trotzdem!
-
der eine edonkey server bedient 500k-800k leute und hat 12 gig ram.
Quelle? Gibt es überhaupt soviele Leute die eMule/eMule nutzen?

-
wenn man das forum verzweifelt nach infos über threads absucht, dann kommt so einiges zu tage

die 500-800k leute sind fakt. im moment sind es 777k, mit 1M als maximum, und das auf dem größten server. die anderen bringen auch nochmal locker ne million zusammen. quelle: http://www.razorback2.com@Surkevin: was verrichtet das programm denn im endeffekt?
-
hi@all + volkard!
ich progge auch grad einen chat server...
ich mache das mit select...select blockiert ja bis etwas passiert: client adden, client message receiven....
ich füge die neuen clients in einem vector ein, u wenn ein client eine message sendet wird mit FD_ISSET im vector nachgeschaut welcher client da was sendet...
hab mal probiert 50 clients zu connecten...funzt prima ohne verzögerung (worst case 3 sekunden)ich arbeite ohne threads!
was meint ihr zu der strategie? macht das icq auch so...ok der icq server gibt ja nur die online clients weiter? werden ja wohl kaum die messages über den icq server laufen? ich denk da wird zwischen den clients eine p2p connection erstellt? so wie auch beim filetransfer?cu
-
bei icq werden msg auch über den server geleitet oder zwischengespeichert.
die haben bestimmt viel härtere maßnahmen, als wir das aus unserer "praxis" gewohnt sind
gruß
-
surf schrieb:
ich füge die neuen clients in einem vector ein, u wenn ein client eine message sendet wird mit FD_ISSET im vector nachgeschaut welcher client da was sendet...
hab mal probiert 50 clients zu connecten...funzt prima ohne verzögerung (worst case 3 sekunden)also etwa so?
for (i = 0; i < NumSocks; i++){ if (FD_ISSET(ServSock[i], &SockSet)) break; }naja, wie lahm wird dieser code bei 100000 clients?
richtig, sehr lahm wird er.ich arbeite ohne threads!
fein. aber durch die schleife um FD_ISSET wirste bei vielen clients ja lahmer als die thread-version.
was meint ihr zu der strategie?
ich halte nix davon.
win schenkt und io completion ports und thread pooling. was du mit ohne threads und FD_ISSET machen kannst, geht auch mit io completion ports, nur schneller. sind die reaktionen auf die pakete wirklich trivial und mit kaum rechenzeit verbunden, könnten threadwechsel relativ teuer sein.macht das icq auch so...ok der icq server gibt ja nur die online clients weiter? werden ja wohl kaum die messages über den icq server laufen? ich denk da wird zwischen den clients eine p2p connection erstellt? so wie auch beim filetransfer?
ich weiß nicht, wie icq das gelöst hat. ich weiß nur, wie ich es lösen würde. ich würde die messages über den icq-server laufen lassen, damit die teilnehmer sich nicht gegenseitig die ip-adressen ausspähen können und dann angriffe fahren. aber ich würde mir was überlegen, daß ich von anfang an mit mehreren servern rechne.
-
-
also etwa so?
for (i = 0; i < NumSocks; i++){ if (FD_ISSET(ServSock[i], &SockSet)) break; }naja, wie lahm wird dieser code bei 100000 clients?
richtig, sehr lahm wird er.win schenkt und io completion ports und thread pooling....
wo find ich da infos über io completion ports drüber, möcht gerne wissen wie das funzt? mein chat client soll ja portabel sein, kann ich das auch für linux einsetzen?
cu
-
IO Completion Ports funktionieren nur auf Windows. Und da nur auf den NT Versionen.
Portabilität gleich 0.
Und für deinen Chat wirst du das wohl kaum brauchen.
-
hallo!
ich hab mal gehört sowas kann man unter linux mit
Asynchronous I/O on linux, POSIX asynchronous I/O machen?cu
-
c.rackwitz schrieb:
die 500-800k leute sind fakt. im moment sind es 777k, mit 1M als maximum, und das auf dem größten server. die anderen bringen auch nochmal locker ne million zusammen. quelle: http://www.razorback2.com
das geht aber nur, weil die verbindungen nicht ständig offen gehalten werden. die clients machen nur anfragen und schliessen die verbindung dann wieder. ansonsten wären die 2^16 portnummern schnell aufgebraucht (so denke ich mir das. hat jemand genauere infos?). der eigentliche datenaustausch läuft eh' zwischen den teilnehmern und geht nicht über die server)