Avatar billede Simon Praktikant
10. april 2006 - 15:10 Der er 11 kommentarer og
1 løsning

socket i .NET

Jeg er ved at kode et program som skal køre på en server win2k. Det skal bl.a. lytte efter socket-forbindelser fra nogle klienter, og besvare dem.

Eksempelvis kunne der lyttes med en TcpListener, som i nedenstående kode:

TcpListener tcpServerListener = new TcpListener(4445);
tcpServerListener.Start();       
Socket serverSocket = tcpServerListener.AcceptSocket();

Kode-afviklingen stopper altså indtil der kommer en socket forespørgsel.

Derfor skal denne del vel over i en seperat tråd, og når der endelig kommer en forespørgsel skal denne håndteres af endnu en tråd, således at der ikke blokeres for flere tråde.

Skal jeg selv implementere alt dette i .NET, eller indeholder .NEt en smårt måde at gøre dette på?
Avatar billede arne_v Ekspert
10. april 2006 - 15:33 #1
jeg mener at du selv skal kode din traad
Avatar billede Simon Praktikant
10. april 2006 - 15:37 #2
jeg har netop fundet denne side som beskriver hvordan det kan gøres asynkront, uden at man skal håndtere tråde. Men jeg er endnu ikke færdig med at læse den

http://www.codeguru.com/Csharp/Csharp/cs_misc/sampleprograms/article.php/c7695/
Avatar billede arne_v Ekspert
11. april 2006 - 04:29 #3
det er ihvertfald en anden måde at gøre det på

om det er smart - det må du jo danne dig din egen mening om
Avatar billede Simon Praktikant
11. april 2006 - 08:19 #4
Hvad mener du? Findes der nemmere måder? Så er jeg meget lydhør. :-)
Avatar billede arne_v Ekspert
12. april 2006 - 04:21 #5
næh - jeg starter bare en tråd selv
Avatar billede tuxic Nybegynder
22. april 2006 - 11:41 #6
Løsningen afhænger vel også af det forventede/faktiske brugsmønster. Oprettes og nedlægges forbindelser hele tiden kan det være tungt at oprette nye tråde hver gang.
Er det arbejde der skal udføres tungt og/eller tidskrævende. Hvis arbejdet er hurtigt overstået kan man fx bruge ThreadPool'en til udføre arbejdet.
Er antallet af samtidige forbindelser stort er det måske også en dårlig ide med separate tråde til hver, da windows så kan bruge urimeligt meget tid på skedulering.
Avatar billede tuxic Nybegynder
29. april 2006 - 13:25 #7
Du kan også bruge en kø: For hver besked du modtager fra socket'en placerer du et objekt i en kø, så har du en anden tråd der afkøer fra køen, behandler requesten og sender svaret retur. (det mønster bruger jeg somme tider. Kræver selvf lige at man overvejer trådsikring af køen, rækkefølgeproblematikker mv).
Avatar billede Simon Praktikant
30. april 2006 - 00:05 #8
Jeg har omkring 100 - 200 clienter tilsluttet, så det kan som tuxic siger godt være lidt tungt. Jeg vil lige overveje muligheden med kø'er som du beskriver. Kan du henvise til nogle sider med eksempler på sådan en kø-socket-implementering?
Avatar billede tuxic Nybegynder
01. maj 2006 - 10:51 #9
Avatar billede tuxic Nybegynder
01. maj 2006 - 10:55 #10
Vedrørende codeproject artiklen har jeg ikke set på koden i detaljer. Nogle af kommentarene kunne indikere problemer fx omkring af klienter der dør. Men som altid, man skal ikke ukritisk tro på alt fra nettet. (Ting jeg skriver er naturligvis en undtagelse ;))
Avatar billede Simon Praktikant
16. august 2006 - 16:12 #11
Jeg valgte selv at kode min tråd asynkront. Der var flere ting der skulle tages højde for. Herunder at sørge for at den samme socket ikke blev brugt af flere tråde samtidigt. Tak for kommentarerne.

tuxic og arne_v, smid svar og point er jeres
Avatar billede arne_v Ekspert
16. august 2006 - 16:18 #12
.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester