Avatar billede nielsr Nybegynder
25. april 2006 - 10:43 Der er 3 kommentarer

Styre pakkestørrelse i TcpClient

Hejsa
Jeg har behov for at kunne styre størrelsen af den pakker mit program sender, da jeg skal sender over en GRE-tunnel, hvor ICMP er blokeret. Så vidt jeg ved betyder det, at den maksimale størrelse ikke kan auto-negotiates, og derfor er jeg nødt til at afsende pakker på ~1360 byte, så størrelsen inkl. header bliver under ~1420 bytes. Andre programmer der bruger tunnellen har også måtte tilpasse deres pakkestørrelse til dette krav. Det er ikke muligt at ændre MTU i registry'en

Jeg kan bare ikke finde noget i .NET dokumentationen om hvordan man stører pakkestørrelsen, og Google antyder at jeg er er den første med dette problem :)

koden, der fungerer fint over mindre strixe netværk, ser sådan ud:

NetworkStream ns = tcpClient.GetStream();
BinaryReader reader = new BinaryReader(fileStream);
byte[] bytes = new byte[1024];
int read;
while( ( read = reader.Read( bytes, 0, bytes.Length ) ) != 0 )
{
    ns.Write(bytes,0,read);
}
reader.Close();
ns.Flush();
ns.Close();

Det forekom mig at hvis jeg kaldte Flush() inde i while'n, ville det fyre en pakke med 1024 bytes payload af, men Networkstream.Flush er åbenbart ikke brugbar - den er 'reserved for future use'

Socket.Send() tager tilsyneladende en int size, men msdn er lidt uklar mht. om det er den faktiske pakkestørrelse man styrer derigennem. det ville også være træls at kode det om til at bruge Sockets og teste det, hvis det kan gøres med en TcpClient ...?

Er der nogen der har en løsning eller et tip der kan få mig videre?
På forhånd tak..
Avatar billede mnc Nybegynder
25. april 2006 - 10:54 #1
Jeg kunne forestille mig at du skal sætte tcpClient.SendBufferSize til 1360, og at problemet så skulle være løst.
Avatar billede nielsr Nybegynder
25. april 2006 - 11:17 #2
Hmm. havde egentlig afskrevet SendBufferSize som relateret til buffers, men kan da være jeg skal finde ethereal frem alligevel, og se hvad der egentlig sker :)
Avatar billede nielsr Nybegynder
02. maj 2006 - 09:51 #3
En lille update:
Har eksperimenteret lidt, og er kommet frem til at pakkestørrelsen til dels kan styres ved et samspil mellem SendBufferSize, bytearray'ets størrelse og propertien TcpClient.NoDelay.
Med et bytearray på 1200 og SendBufferSize på op til 1200 kan jeg sende pakker på 1200 byte, men det går ret langsomt.
Sætter jeg NoDelay = true, fungerer det med SendBufferSize = 2400, men pudsigt nok ikke ved 3600 og derover - hastigheden er bedre end ved SendBufferSize = 1200, men stadig ikke så høj.

Det er da en nødløsning. Jeg er bare ikke sikker på om det vil opføre sig ens på andre netværk, så jeg er stadig interesseret i, om der skulle være en mere korrekt og robust løsning.
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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