Vra

Ek is op soek na enige strategieë wat mense gebruik wanneer hulle bedienertoepassings implementeer wat dienskliënt TCP (of UDP) versoek:ontwerppatrone, implementeringstegnieke, beste praktyke, ens.

Kom ons neem vir die doeleindes van hierdie vraag aan dat die versoeke relatief lank duur ('n paar minute) en dat die verkeer tydsensitief is, dus geen vertragings is aanvaarbaar om op boodskappe te reageer nie.Ons bedien ook versoeke van kliënte en maak ons ​​eie verbindings met ander bedieners.

My platform is .NET, maar aangesien die onderliggende tegnologie dieselfde is, ongeag die platform, stel ek belang om antwoorde vir enige taal te sien.

Was dit nuttig?

Oplossing

Die moderne benadering is om van die bedryfstelsel gebruik te maak om baie netwerksokke vir jou te vermenigvuldig, wat jou toepassing vrymaak om slegs aktiewe verbindings met verkeer te verwerk.

Wanneer jy 'n sok oopmaak, word dit met 'n kieser geassosieer.Jy gebruik 'n enkele draad om daardie keurder te stem.Wanneer data ook al aankom, sal die kieser die sok aandui wat aktief is, jy gee daardie bewerking aan 'n kinderdraad oor en gaan voort om te stem.

Op hierdie manier benodig jy net 'n draad vir elke gelyktydige bewerking.Sokke wat oop is, maar ledig is, sal nie 'n draad vasmaak nie.

Ander wenke

'n Meer gesofistikeerde benadering sou wees om IO Completion-poorte te gebruik.(Windows) Met IO -voltooiingspoorte, laat u die bedryfstelsel oor om stembus te bestuur, waardeur dit moontlik 'n baie hoë vlak van optimalisering met NIC -bestuurderondersteuning kan gebruik.Basies het u 'n tou netwerkbedrywighede wat deur die bedryfstelsel bestuur word, en bied 'n terugbelfunksie wat geroep word wanneer die operasie voltooi is.'n Bietjie soos (Hardeskyf) DMA maar vir netwerk.

Len Holgate het 'n paar jaar gelede 'n uitstekende reeks oor IO-voltooiingspoorte op Codeproject geskryf:http://www.codeproject.com/KB/IP/jbsocketserver2.aspx

En ek het 'n artikel oor IO -voltooiingspoorte vir .NET gevind (het dit egter nog nie gelees nie)http://www.codeproject.com/KB/cs/managediocp.aspx

Ek sou ook sê dat dit maklik is om voltooiingpoorte te gebruik in vergelyking met 'n skaalbare alternatief te probeer skryf.Die probleem is dat hulle slegs beskikbaar is op NT (2000, XP, Vista)

As jy C++ en die Win32 direk gebruik het, stel ek voor dat jy lees oor oorvleuelde I/O en I/O Completion-poorte.Ek het 'n gratis C++, IOCP, kliënt/bediener raamwerk met volledige bronkode, sien hier vir meer besonderhede.

Aangesien jy .Net gebruik, moet jy kyk na die gebruik van die asynchrone sokmetodes sodat jy nie 'n draad vir elke verbinding hoef te hê nie;daar is verskeie skakels vanaf hierdie blogplasing van my wat nuttige beginpunte kan wees: http://www.lenholgate.com/blog/2005/07/disappointing-net-sockets-article-in-msdn-magazine-this-month.html (sommige van die beste skakels is in die kommentaar op die oorspronklike plasing!)

Dag,

Ek sal begin deur te kyk na die metafoor wat jy vir jou draadraamwerk wil gebruik.

Miskien "leier volger" waar 'n draad luister vir inkomende versoeke en wanneer 'n nuwe versoek inkom doen dit die werk en die volgende draad in die poel begin luister vir inkomende versoeke.

Of draadpoel waar dieselfde draad altyd luister vir inkomende versoeke en dan die versoeke oordra na die volgende beskikbare draad in die draadpoel.

Jy sal dalk graag die Reaktor afdeling van die Ace-komponente om 'n paar idees te kry.

HTH.

Cheers, Rob

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top