Vra

Ek werk op'n .netto oplossing wat loop heeltemal binne-in'n enkele netwerk.Wanneer gebruikers'n verandering aan die stelsel, ek wil om te begin'n aankondiging en almal hoor dit en dienooreenkomstig op te tree.Is daar'n manier wat ons kan uitsending uit boodskappe soos hierdie (soos UDP sal laat jy dit doen), terwyl die behoud van gewaarborgde lewering (soos TCP)?

Dit is op'n klein netwerk (30ish kliënte), as sou dit'n verskil maak.

Was dit nuttig?

Oplossing

Byna al gespeel het 'n behoefte aan die vinnig reageer eienskappe (en tot 'n mindere mate, die verbindinglose eienskappe) van UDP en die betroubaarheid van TCP. Wat hulle doen, is hulle bou hul eie betroubare protokol op die top van UDP. Dit gee hulle die vermoë om net bars pakkies aan whereever en opsioneel maak hulle betroubare, sowel.

Die betroubare pakkie stelsel is gewoonlik 'n eenvoudige weer probeer-tot-erkende stelsel eenvoudiger as TCP maar daar is protokolle wat ver verby wat TCP kan bied gaan.

Jou situasie klink baie eenvoudig. Jy sal waarskynlik in staat wees om die skoonste oplossing jouself te maak -. Net maak elke kliënt stuur terug 'n "ek jou hoor" reaksie en het die bediener te hou probeer totdat dit raak dit (of gee up)

As jy iets meer wil hê nie, die meeste persoonlike protokol biblioteke is in C ++, so ek is nie seker hoeveel gebruik hulle sal vir julle wees. Maar ek weet hier is 'n paar jaar oud - miskien 'n paar protokolle is oor oorgedra deur die nou. Hmm ... RakNet en eNet is twee C / C ++ biblioteke wat in jou gedagtes opkom.

Ander wenke

Neem 'n blik op sctp wat 'n kombinasie van TCP en UDP funksies het. Daar is 'n Windows implementering beskikbaar.

Jy kan Smeer om groep kommunikasie te doen.

@epatel - ek tweede die SCTP voorstel (ek het nie, maar kan nie kommentaar lewer nie, maar tog so bykomende dinge hier).

SCTP het baie groot funksies en buigsaamheid. Jy kan sub-verdeel jou verband in verskeie strome, en kies die reliablity van elke en of dit nie beveel of. Alternatiewelik, met die Gedeeltelik Betroubaarheid uitbreiding, kan jy beheer oor betroubaarheid op 'n per boodskap basis.

Broadcast is nie wat jy wil hê. Aangesien daar kan en waarskynlik sal wees toestelle gekoppel aan hierdie netwerk wat nie omgee vir jou boodskap, moet jy Multicast gebruik. In teenstelling met uitsending boodskappe wat na deur elke kliënt op die netwerk gestuur moet word en verwerk word, is Multicast boodskappe gelewer net belangstel kliënte (dws diegene wat 'n paar voorneme het om hierdie spesifieke tipe van boodskap en daarop te reageer dit ontvang).

As jy later skaal hierdie stelsel op sodat dit moet oor 'n groot netwerk te verslaan, kan multicast skaal aan daardie, terwyl uitgesaai sal nie, so jy kry 'n scalability voordeel wat jy later kan waardeer. Intussen jy elimineer onnodige oorhoofse in skakelaars en ander toestelle wat nie nodig het om hierdie "iets verander" boodskappe te sien.

Jy mag dalk wil om te kyk na RFC 3208 "PGM betroubare vervoer protokol spesifikasie".

Hier is die opsomming:

  

Pragmatic General Multicast (PGM)   is 'n betroubare multicast vervoer
  protokol vir aansoeke wat vereis   bestel of ongeordende, Woordeboek   dupliseer-vrye, multicast data   lewering van verskeie bronne om
  verskeie ontvangers. PGM waarborge   dat 'n ontvanger in die groep óf   ontvang al die data pakkies van   uitsendings en herstelwerk, of is   kan nie herwin data op te spoor   pakkie verlies. PGM is spesifiek   bedoel as 'n werkbare oplossing vir   multicast aansoeke met basiese   betroubaarheid vereistes. sy sentrale   ontwerp doel is eenvoud van   werking met inagneming van   scalability en netwerk doeltreffendheid.

Jy kan 'n boodskap Broker, gebruik soos ActiveMQ .
Publiseer jou boodskappe na 'n onderwerp en het die kliënte duursame inskrywing registreer om die onderwerp, sodat hulle geen boodskappe sal mis selfs al is hulle nie aanlyn.

  

Apache ActiveMQ is 'n boodskap makelaar   geskryf in Java saam met 'n volle   JMS kliënt. Maar Apache ActiveMQ is   ontwerp om oor te kommunikeer 'n aantal   van protokolle soos Stomp en   OpenWire saam met die ondersteuning van 'n   aantal ander taal spesifieke   kliënte.

kliënt platform ondersteuning sluit c # en NET

Jy kan jou eie TCP-agtige gedrag by die aansoek laag te implementeer.

So byvoorbeeld, sal jy stuur uit die UDP uitgesaai, maar dan verwag 'n antwoord reaksie van elke gasheer. As jy 'n antwoord binne X sekondes nie gekry het nie, dan stuur 'n ander en so aan totdat die bereiking van 'n soort van drumpel. As die drempelwaarde bereik (dit wil sê die gasheer het glad nie reageer), dan rapporteer 'n fout.

Om hierdie al doen, sal jy 'n pre-gedefinieerde lys van gashere benodig om die antwoorde terug vanaf verwag.

Skep 'n TCP bediener. Het elke kliënt te verbind. In jou TCP-protokol met die kliënte, skep elke pakkie met 'n 2-byte voorvoegsel van die totale grootte van die volgende boodskap.

Kliënte noem dan read(max_size=2) op die aansluiting van die grootte van die volgende boodskap te bepaal, en dan read(max_size=s) om die boodskap in te samel.

Jy kry betroubare, beveel boodskappe, eenvoudig. Jy hoef nie 'n boodskap raamwerk vir hierdie een nodig het.

'n Mens sou beslis wil om te kyk na Pragmatic General Multicast :

  

Hoewel TCP gebruik ACKs om groepe van pakkies gestuur erken (iets wat sal wees onekonomies oor multicast ), PGM gebruik die konsep van 'n negatiewe Erkennings (Naks).

Vir verdere G-duik , die term wat jy soek is betroubare multicast . neem ook 'n blik op Multi TCP .

Wat jy kan doen is dat na die uitsending het die kliënte inisieer die TCP verbindings. Anders sal jy net moet 'n lys van al die kliënte die verbindings aan elke kliënt jouself te hou en te inisieer.

Ek dink daar is drie opsies, breedweg:

  1. In plaas van uitsaai UDP, jy kan skep'n entiteit ('n draad, proses, bediener, diens, of wat ook al die ding is wat bestaan in jou oplossing) wat hou'n lys van intekenaars en stuur unicast UDP boodskappe aan hulle.
  2. Gebruik UDP multicast, maar jy sal hê om te skryf'n soort van die meganisme wat sal neem sorg van betroubare lewering vir jou (d. w. s, pogingen, time-outs, ens).Dit beteken ook jy het om te kry'n antwoord van jou kliënte.
  3. As jy nie bang is van die eksperimentele vervoer protokolle, kan jy kyk hier vir voorstelle.,

JoJ moet 'n blik op die Norm (Nack-georiënteerde Betroubare Multicast) spesifikasie neem. Jy kan inligting oor Norm hier vind.

  

Die norm protokol is ontwerp om   bied end-tot-end betroubare vervoer   van grootmaat data voorwerpe of strome oor   generiese IP multicast routing en   aanstuur dienste. NORM gebruik van 'n   selektiewe, negatiewe erkenning   (Nack) meganisme vir vervoer   betroubaarheid en bied bykomende   protokol meganismes om uit te voer   betroubare multicast sessies met   beperkte "a priori" koördinasie tussen   senders en ontvangers

Dit ietwat baie bekende in die militêre wêreld.

Norm specs.

Norm Bron

Hoekom iets van nuuts af te bou as jy biblioteek kan gebruik? Veral vir so 'n klein projek?

Probeer gebruik Emcaster wat self met behulp van betroubare multicast boodskappe - PGM, is geskryf in. NET en met volle bron. Jy sal lekker kroeg / sub-enjin met onderwerp filter geredelik beskikbaar te kry. Of jy kan leer uit-kode hoe om dit te doen en baseer jou eie uitbreiding op dit.

Ek dink die mees irriterende funksie van TCP in hierdie scenario is die vermoë / manier van sorteer inkomende pakkies aan hul oorspronklike orde - die konsep van 'n stroom. Jy kan 'n greep nie lees totdat die byte voordat dit aankom.

As jy kan leef sonder dit, jy het jou kans om jou protokol, vinnige en betroubare, maar nie vir die bestel van pakkies het! Dit is eenvoudig onmoontlik om beide van hulle te bestuur, omdat jy nie jou grepe kan bestel totdat jy 'n ander kopie van 'n verlore pakkie ontvang, dit is die belangrikste nadeel.

doen 'n RDP multicast.

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