sp33d3r_89 Skrevet 28. august 2011 Del Skrevet 28. august 2011 Hei Jeg driver å lager en serverApp som skal ta imot kommandoer og utføre diverse funksjoner utifra hvem kommandoer den mottar. Serveren skal være asynkron, den skal kunne ta imot fra flere klienter og poste data tilbake til de andre klientene. Det jeg lurer på er hvordan jeg får serveren til å fortsette å se etter nye tilkoblinger når den allerede har fått tilkobling til en klient? Har sett at flere eksempler på nettet kjører beginAccept i en while(true) løkke, mens andre har AsyncCallback i beginAccept. Er litt usikker på hvem metode som er mest korrekt? Takker for alle svar Lenke til kommentar
torbjørn marø Skrevet 28. august 2011 Del Skrevet 28. august 2011 Du kan se hvordan jeg gjør det i en minimal http-server i .Net. Bruker basically ThreadPool.QueueUserWorkItem(). Lenke til kommentar
sp33d3r_89 Skrevet 28. august 2011 Forfatter Del Skrevet 28. august 2011 Ser du bruker en uendelig løkke som fortsetter å se etter tilkoblinger. Jeg vurderer å bruke en uendelig løkke, asyncCallback sørger for å kjøre imellom resten av prosessene. Er det andre måter å utføre prosessen med å se etter nye tilkoblinger enn løkke-metoden? Er det mulig å holde socketen åpen hele veien så den kan brukes i evt en chat? eller er dette resurskrevende? Lenke til kommentar
sp33d3r_89 Skrevet 28. august 2011 Forfatter Del Skrevet 28. august 2011 Henter forresten inspirasjon og tips fra : http://msdn.microsoft.com/en-us/library/fx6588te%28v=vs.71%29.aspx Og her blir det brukt ManualResetEvent classen. Slik jeg har forstått, så prøver den å skape tilkoblingen før den tar imot tilkobling fra en annen klient? Lenke til kommentar
GeirGrusom Skrevet 29. august 2011 Del Skrevet 29. august 2011 Klipp og lim fra noe kode jeg skrev på jobben: public void OpenGdbListener(int port) { GdbListener = new TcpListener(IPAddress.Loopback, port); GdbListener.Start(); GdbListener.BeginAcceptTcpClient(AcceptClient, null); GdbPort = port; } private void AcceptClient(IAsyncResult result) { var client = GdbListener.EndAcceptTcpClient(result); lock (Clients) { var gdb = new GdbClient(client); gdb.CommandRecieved += new EventHandler<GdbCommandRecievedEventArgs>(gdb_CommandRecieved); Clients.Add(gdb); } GdbListener.BeginAcceptTcpClient(AcceptClient, null); } GdbClient starter en ny tråd som leser og skriver kommandoer til GDB klienten. Dog denne koden er tiltenkt å brukes kun på lokalmaskinen. For å stoppe BeginAccept så kaller du bare Close() på listener. TcpClient har en funksjon som heter GetStream som lar deg lese og skrive. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå