Hey,
ich arbeite zurzeit an meinem Projekt "WAS - Watch another Screen".
Es gibt einen Server und einen Client.
Der Server schickt als erstes ein Daten-Paket mit der Größe von ca. 3 Millionen Bytes.
Der Client liest die Bytes in einen Buffer ein.
Wenn ich mir nach dem Empfangen allerdings das empfangene Byte-Array anschaue, merke ich dass ab dem 16060. Byte nur noch 0en sind.
Hier die dazugehörigen Code-Schnipsel:
Die Send-Methode meiner Server-Klasse.
public void Send(byte[] packet)
{
byte[] x = BitConverter.GetBytes(packet.Length);
connection.Send(x); // connection = Socket
connection.SendBufferSize = packet.Length;
connection.Send(packet);
}
Die GetPacket-Funktion meiner Client-Klasse:
public byte[] GetPacket()
{
while (client.Available == 0)
{
System.Threading.Thread.Sleep(50);
}
byte[] l = new byte[4];
client.Receive(l); // client = Socket
int x = BitConverter.ToInt32(l, 0);
byte[] buffer = new byte[x];
client.ReceiveBufferSize = x;
client.Receive(buffer);
return buffer;
}
Übrings: Vor jedem Packet werden immer erst 4 Bytes vom Server gesendet, welche dem Client sagen, welche Größe das Byte-Array hat, damit der Buffer dementsprechend groß initialisiert werden kann.
Was komisch ist: Wenn ich die Get-Packet - Funktion Zeile für Zeile debugge, kommen alle Bytes an...
Kennt ihr dieses Problem, könnt ihr mir helfen?
Lg Chris!
Der Rückgabewert ist unterschiedlich.
Aber zusammengefasst zwsichen 10'000 und 100'000.
Aber Welten weg von der eigenentlichen Anzahl von Bytes, die gesendet wurden! (Wie gesagt, ~3'000'000)
Lg
Ich kannte den Begriff "Network Tracing" vorher garnicht.
Zwar finde ich diesen Eintrag in der MSDN: http://msdn.microsoft.com/en-us/library/a6sbz1dx.aspx , allerdings verstehe ich nicht wie es funktioniert und nicht was das überhaupt ist.
Der Name selbst sagt ja soviel aus wie "Netzwerk Verfolgung" - erinnert mich an WireShark.
Ist das sowas in der Art?
Wäre dir sehr dankbar wenn du mich in dem Thema ein wenig aufklären würdest (;
Lg
Wie hast du denn die Sockets initialisiert, also ProtocolType SocketType etc.?
Wie hast du denn die Sockets initialisiert, also ProtocolType SocketType etc.?
public WASClient()
{
client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
}
was wireshark ist, weiß ich nciht. du kannst dich bei aktiviertem tracing mit dem debugger dranhängen und im outputwindow sehen, was genau verarbeitet und gesendet wird und was empfangen wird.
Hört sich intressant an, allerdings verstehe ich (weder durch den Eintrag der MSDN, noch durch Google) wie man Tracing benutzt.
Ein Beispiel wäre super!
Lg Chris
Was gibt denn BitConverter.GetBytes(packet.Length); zurück?
Sicher das die Länge richtig konvertiert wird?
Probiere doch mal beim Client den buffer manuell zu setzen für das 3MB file.
Also:
byte[] buffer = new byte[3000000]; //natürlich auf den genauen Wert...
@JAck30lena: Okay ich probier mich dran! Danke!
@monson: Das war das erste was ich überprüft hab (;
Lh
Hab es jetzt mal nachgebaut.
Problem:
Das Sendes des Packets passiert zu schnell, der Empfänger verarbeitet noch die Geschichte mit der Packetgröße, da ist der Server schon längst wieder am senden.
Wenn du einen Delay von einer Sekunde dazwischen packst sollte es funktionieren. Sprich:
byte[] x = BitConverter.GetBytes(packet.Length);
connection.Send(x); // connection = Socket
connection.SendBufferSize = packet.Length;
Thread.Sleep(1000); //Sekündchen warten
connection.Send(packet);
Gruß,
moson