public IPEndPoint (IPAddress address, int port)
{
if (address == null)
- throw new ArgumentNullException ("Value cannot be null");
+ throw new ArgumentNullException ("address");
Address = address;
Port = port;
}
- public IPEndPoint (long iaddr, int port) : this (new IPAddress (iaddr), port)
+ public IPEndPoint (long iaddr, int port)
{
+ Address = new IPAddress (iaddr);
+ Port = port;
}
public IPAddress Address {
// bytes 2 and 3 store the port, the rest
// stores the address
- public override EndPoint Create(SocketAddress sockaddr) {
- int size=sockaddr.Size;
-
- // LAMESPEC: no mention of what to do if
- // sockaddr is bogus
- if(size<8) {
- // absolute minimum amount needed for
- // an address family, buffer size,
- // port and address
- return(null);
- }
+ public override EndPoint Create (SocketAddress socketAddress)
+ {
+ if (socketAddress == null)
+ throw new ArgumentNullException ("socketAddress");
- AddressFamily family=(AddressFamily)sockaddr[0];
+ if (socketAddress.Family != AddressFamily)
+ throw new ArgumentException ("The IPEndPoint was created using " + AddressFamily +
+ " AddressFamily but SocketAddress contains " + socketAddress.Family +
+ " instead, please use the same type.");
+
+ SocketAddress sockaddr = socketAddress;
+ int size =sockaddr.Size;
+ AddressFamily family = sockaddr.Family;
int port;
IPEndPoint ipe = null;
switch(family)
- {\r
- case AddressFamily.InterNetwork:\r
+ {
+ case AddressFamily.InterNetwork:
+ if (size < 8) {
+ return(null);
+ }
+
port = (((int)sockaddr[2])<<8) + (int)sockaddr[3];
long address=(((long)sockaddr[7])<<24) +
(((long)sockaddr[6])<<16) +
(((long)sockaddr[5])<<8) +
(long)sockaddr[4];
- ipe = new IPEndPoint(address, port);\r
- break;\r
-#if NET_1_1\r
- case AddressFamily.InterNetworkV6:\r
+ ipe = new IPEndPoint(address, port);
+ break;
+#if NET_1_1
+ case AddressFamily.InterNetworkV6:
+ if (size < 28) {
+ return(null);
+ }
+
port = (((int)sockaddr[2])<<8) + (int)sockaddr[3];
/// maybe flowid ?
for(int i=0; i<8; i++)
addressData[i] = (ushort)((sockaddr[8+i*2] << 8) + sockaddr[8+i*2+1]);
- ipe = new IPEndPoint (new IPAddress(addressData, scopeId), port);\r
- break;\r
-#endif\r
- default:\r
- return null;\r
+ ipe = new IPEndPoint (new IPAddress(addressData, scopeId), port);
+ break;
+#endif
+ default:
+ return null;
}
return(ipe);
SocketAddress sockaddr = null;
switch (address.AddressFamily)
- {\r
- case AddressFamily.InterNetwork:\r
+ {
+ case AddressFamily.InterNetwork:
// .net produces a 16 byte buffer, even though
// only 8 bytes are used. I guess its just a
// holdover from struct sockaddr padding.
sockaddr [5] = (byte) ((addr >> 8) & 0xff);
sockaddr [6] = (byte) ((addr >> 16) & 0xff);
sockaddr [7] = (byte) ((addr >> 24) & 0xff);
- break;\r
-#if NET_1_1\r
- case AddressFamily.InterNetworkV6:\r
+ break;
+#if NET_1_1
+ case AddressFamily.InterNetworkV6:
sockaddr = new SocketAddress(AddressFamily.InterNetworkV6, 28);
sockaddr [2] = (byte) ((port>>8) & 0xff);
sockaddr [24] = (byte) (address.ScopeId & 0xff);
sockaddr [25] = (byte) ((address.ScopeId >> 8) & 0xff);
sockaddr [26] = (byte) ((address.ScopeId >> 16) & 0xff);
- sockaddr [27] = (byte) ((address.ScopeId >> 24) & 0xff);\r
- break;\r
-#endif\r
+ sockaddr [27] = (byte) ((address.ScopeId >> 24) & 0xff);
+ break;
+#endif
}
return(sockaddr);