One of these (the second I think) will do what you want with regard to inserting the IP address at offset 50: (the former is directly cribbed from BinaryWriter.Write(Int32), the latter just has the offset reversed which I think is what IPAddress.HostToNetworkOrder(myInt) does for an LSB-first machine)
buffer[50] = (byte) value; buffer[51] = (byte) (value >> 8); buffer[52] = (byte) (value >> 0x10); buffer[53] = (byte) (value >> 0x18); buffer[53] = (byte) value; buffer[52] = (byte) (value >> 8); buffer[51] = (byte) (value >> 0x10); buffer[50] = (byte) (value >> 0x18); Cheers Simon > -----Original Message----- > From: Discussion of advanced .NET topics. > [mailto:[EMAIL PROTECTED] On Behalf Of > Itay Zandbank > Sent: 29 October 2006 12:28 > To: ADVANCED-DOTNET@DISCUSS.DEVELOP.COM > Subject: [ADVANCED-DOTNET] Efficient .NET Networking > > Hi. > > For the first time since I started working with .NET, I > need to write > some TCP/IP code. While I only need to connect to a server > socket, send > one handshake packet and wait for incoming data, I started having very > dim thoughts about high-performance communication servers in .NET . > > First there's the problem of packing binary data into a byte[] ready > to be sent to the network. I want to take a 32 bit integer > and put it in > offest 50 of a byte[] array (which is my outgoing message). > Naturally, I > can do this: > > BitConvert.GetBytes(IPAddress.HostToNetworkOrder(myInt)).CopyTo(msg, > 50); > > What this does (unless I'm missing something) is allocate a 4-byte > array, put the number in it, copy the 4 bytes to my outgoing message > buffer and, when it's time for garbage collection, free the 4-byte > array. This isn't the most efficient way to accomplish this, and I'm > being polite. If BitConvert offered a GetBytes(int, byte[], offset) > method, it could have worked a lot faster (and I do mean A LOT). > > This is the smaller problem of the two. I can write an > unsafe version > of BitConvert that will spare the extra memory allocation and > copy. The > bigger problem I encountered was waiting for incoming socket > events. My > application waits for two kinds of events - socket events and another > WaitHandle that is set when there's some other work to do. > > To make everything work, I call > BeginReceive/BeginConnect/BeginSomething on my socket, and in the main > loop I WaitHandle.WaitAny(...) on my handles (event and last socket > operation handle). This works, but generates memory allocations inside > BeginReceive. I also need to allocate my WaitHandle[] array > every time, > because sometimes I wait for 2 handles and sometimes just for > 1. I could > allocate two arrays in advance and use the appropriate one, > but it will > turn ugly if the number of handles I wait on varies... > > While the performance impact on my application is negligible, this > sort of overhead can be a killer for a high-performance server > application. Do server developers need to resort to Windows API to use > IOCPs and control when memory is allocated using the unmanaged heap > (basically saying C++ is the way to go and not C#)? > > Thanks, > Itay. > > <html><body><center><hr><b><font face=arial size=2>Visit the > Tel Aviv Stock Exchange's Website<a href=http://www.tase.co.il> > www.tase.co.il</a></b></body></html> > > =================================== > This list is hosted by DevelopMentor(r) http://www.develop.com > > View archives and manage your subscription(s) at > http://discuss.develop.com > =================================== This list is hosted by DevelopMentor® http://www.develop.com View archives and manage your subscription(s) at http://discuss.develop.com