Socket mit Network-Byte-Order

13/07/2009 - 19:49 von Martin Greul | Report spam
Hallo,

ich möchte das gerne ohne unsafe lösen.
Leider weiß ich nicht wie.

Ich möchte einen Integer in ein 4 Byte reinkopieren.

Kann mir jemand helfen?

Ich darf auch nicht zweimal schreiben, sonst versteht es der Server nicht.

Danke im Voraus.
Viele Grüße Martin

unsafe void SendTelegram(string telegramm)
//void SendTelegram(string telegramm)
{
BinaryWriter writer = new BinaryWriter(_stream);
byte[] data = TextEncoding.GetBytes(telegramm);

int lengthInNetworkOrder //IPAddress.HostToNetworkOrder(data.Length + 4);
IPAddress.NetworkToHostOrder(data.Length + 4);



int nLength = data.Length;
// ** Specification --> header (4 Byte)
Byte[] bytesSent = new Byte[nLength + 4];
fixed (byte* p = &bytesSent[0])
{
int* pi = (int*)p;
*pi = System.Net.IPAddress.NetworkToHostOrder(nLength + 4);
}
System.Array.Copy(data, 0, bytesSent, 4, nLength);
// writer.Write(lengthInNetworkOrder);
writer.Write(bytesSent);
}
 

Lesen sie die antworten

#1 Martin Greul
13/07/2009 - 21:06 | Warnen spam
Hallo,


int nLength = data.Length;
// ** Specification --> header (4 Byte)
Byte[] bytesSent = new Byte[nLength + 4];
fixed (byte* p = &bytesSent[0])
{
int* pi = (int*)p;
*pi = System.Net.IPAddress.NetworkToHostOrder(nLength + 4);
}
System.Array.Copy(data, 0, bytesSent, 4, nLength);
// writer.Write(lengthInNetworkOrder);
writer.Write(bytesSent);



so geht es auch nicht.

Warum, siehe ####

public int Send(string msg)
{
if (!sck1.Connected) return 0;
if (msg.Length == 0) return 0;
byte[] bufOut = enc.GetBytes(msg);
using (MemoryStream ms = new MemoryStream())
{
using (BinaryWriter bs = new BinaryWriter(ms))
bs.Write(IPAddress.HostToNetworkOrder(bufOut.Length)); ####
sck1.Send(ms.ToArray(), SocketFlags.None);
}
return sck1.Send(bufOut, SocketFlags.None); ####
}

es wird 2 mal geschrieben, der Server meint nun das erste Telegramm
stimmt nicht.

Grüße Martin

Ähnliche fragen