diff --git a/src/DeviceInterfaces/System.Net/sys_net_native.cpp b/src/DeviceInterfaces/System.Net/sys_net_native.cpp index 61c5b6fedc..b42d5a8461 100644 --- a/src/DeviceInterfaces/System.Net/sys_net_native.cpp +++ b/src/DeviceInterfaces/System.Net/sys_net_native.cpp @@ -95,6 +95,10 @@ static const CLR_RT_MethodHandler method_lookup[] = NULL, NULL, NULL, + NULL, + NULL, + NULL, + NULL, Library_sys_net_native_System_Net_NetworkInformation_NetworkInterface::InitializeNetworkInterfaceSettings___VOID, Library_sys_net_native_System_Net_NetworkInformation_NetworkInterface::UpdateConfiguration___VOID__I4, NULL, @@ -157,9 +161,12 @@ static const CLR_RT_MethodHandler method_lookup[] = NULL, NULL, NULL, + NULL, + NULL, + NULL, Library_sys_net_native_System_Net_Sockets_NativeSocket::socket___STATIC__I4__I4__I4__I4, - Library_sys_net_native_System_Net_Sockets_NativeSocket::bind___STATIC__VOID__OBJECT__SZARRAY_U1, - Library_sys_net_native_System_Net_Sockets_NativeSocket::connect___STATIC__VOID__OBJECT__SZARRAY_U1__BOOLEAN, + Library_sys_net_native_System_Net_Sockets_NativeSocket::bind___STATIC__VOID__OBJECT__SystemNetEndPoint, + Library_sys_net_native_System_Net_Sockets_NativeSocket::connect___STATIC__VOID__OBJECT__SystemNetEndPoint__BOOLEAN, Library_sys_net_native_System_Net_Sockets_NativeSocket::send___STATIC__I4__OBJECT__SZARRAY_U1__I4__I4__I4__I4, Library_sys_net_native_System_Net_Sockets_NativeSocket::recv___STATIC__I4__OBJECT__SZARRAY_U1__I4__I4__I4__I4, Library_sys_net_native_System_Net_Sockets_NativeSocket::close___STATIC__I4__OBJECT, @@ -167,8 +174,8 @@ static const CLR_RT_MethodHandler method_lookup[] = Library_sys_net_native_System_Net_Sockets_NativeSocket::accept___STATIC__I4__OBJECT, Library_sys_net_native_System_Net_Sockets_NativeSocket::getaddrinfo___STATIC__VOID__STRING__BYREF_STRING__BYREF_SZARRAY_SZARRAY_U1, Library_sys_net_native_System_Net_Sockets_NativeSocket::shutdown___STATIC__VOID__OBJECT__I4__BYREF_I4, - Library_sys_net_native_System_Net_Sockets_NativeSocket::sendto___STATIC__I4__OBJECT__SZARRAY_U1__I4__I4__I4__I4__SZARRAY_U1, - Library_sys_net_native_System_Net_Sockets_NativeSocket::recvfrom___STATIC__I4__OBJECT__SZARRAY_U1__I4__I4__I4__I4__BYREF_SZARRAY_U1, + Library_sys_net_native_System_Net_Sockets_NativeSocket::sendto___STATIC__I4__OBJECT__SZARRAY_U1__I4__I4__I4__I4__SystemNetEndPoint, + Library_sys_net_native_System_Net_Sockets_NativeSocket::recvfrom___STATIC__I4__OBJECT__SZARRAY_U1__I4__I4__I4__I4__BYREF_SystemNetEndPoint, Library_sys_net_native_System_Net_Sockets_NativeSocket::getpeername___STATIC__VOID__OBJECT__BYREF_SZARRAY_U1, Library_sys_net_native_System_Net_Sockets_NativeSocket::getsockname___STATIC__VOID__OBJECT__BYREF_SZARRAY_U1, Library_sys_net_native_System_Net_Sockets_NativeSocket::getsockopt___STATIC__VOID__OBJECT__I4__I4__SZARRAY_U1, @@ -228,14 +235,15 @@ static const CLR_RT_MethodHandler method_lookup[] = NULL, NULL, NULL, + NULL, Library_sys_net_native_System_Security_Cryptography_X509Certificates_X509Certificate::ParseCertificate___STATIC__VOID__SZARRAY_U1__STRING__BYREF_STRING__BYREF_STRING__BYREF_mscorlibSystemDateTime__BYREF_mscorlibSystemDateTime, NULL, }; const CLR_RT_NativeAssemblyData g_CLR_AssemblyNative_System_Net = { - "System.Net", - 0x808BAB84, + "System.Net", + 0xB541AF57, method_lookup, - { 1, 0, 7, 0 } + { 1, 1, 0, 0 } }; diff --git a/src/DeviceInterfaces/System.Net/sys_net_native.h b/src/DeviceInterfaces/System.Net/sys_net_native.h index cfb1210f45..48158a00b7 100644 --- a/src/DeviceInterfaces/System.Net/sys_net_native.h +++ b/src/DeviceInterfaces/System.Net/sys_net_native.h @@ -58,7 +58,9 @@ struct Library_sys_net_native_System_Net_IPAddress static const int FIELD_STATIC__Any = 2; static const int FIELD_STATIC__Loopback = 3; - static const int FIELD__m_Address = 1; + static const int FIELD___address = 1; + static const int FIELD___family = 2; + static const int FIELD___numbers = 3; //--// @@ -67,8 +69,8 @@ struct Library_sys_net_native_System_Net_IPAddress struct Library_sys_net_native_System_Net_IPEndPoint { - static const int FIELD__m_Address = 1; - static const int FIELD__m_Port = 2; + static const int FIELD___address = 1; + static const int FIELD___port = 2; //--// @@ -179,6 +181,7 @@ struct Library_sys_net_native_System_Net_Security_SslStream struct Library_sys_net_native_System_Net_SocketAddress { static const int FIELD__m_Buffer = 1; + static const int FIELD___address = 2; //--// @@ -188,8 +191,8 @@ struct Library_sys_net_native_System_Net_SocketAddress struct Library_sys_net_native_System_Net_Sockets_NativeSocket { NANOCLR_NATIVE_DECLARE(socket___STATIC__I4__I4__I4__I4); - NANOCLR_NATIVE_DECLARE(bind___STATIC__VOID__OBJECT__SZARRAY_U1); - NANOCLR_NATIVE_DECLARE(connect___STATIC__VOID__OBJECT__SZARRAY_U1__BOOLEAN); + NANOCLR_NATIVE_DECLARE(bind___STATIC__VOID__OBJECT__SystemNetEndPoint); + NANOCLR_NATIVE_DECLARE(connect___STATIC__VOID__OBJECT__SystemNetEndPoint__BOOLEAN); NANOCLR_NATIVE_DECLARE(send___STATIC__I4__OBJECT__SZARRAY_U1__I4__I4__I4__I4); NANOCLR_NATIVE_DECLARE(recv___STATIC__I4__OBJECT__SZARRAY_U1__I4__I4__I4__I4); NANOCLR_NATIVE_DECLARE(close___STATIC__I4__OBJECT); @@ -197,8 +200,8 @@ struct Library_sys_net_native_System_Net_Sockets_NativeSocket NANOCLR_NATIVE_DECLARE(accept___STATIC__I4__OBJECT); NANOCLR_NATIVE_DECLARE(getaddrinfo___STATIC__VOID__STRING__BYREF_STRING__BYREF_SZARRAY_SZARRAY_U1); NANOCLR_NATIVE_DECLARE(shutdown___STATIC__VOID__OBJECT__I4__BYREF_I4); - NANOCLR_NATIVE_DECLARE(sendto___STATIC__I4__OBJECT__SZARRAY_U1__I4__I4__I4__I4__SZARRAY_U1); - NANOCLR_NATIVE_DECLARE(recvfrom___STATIC__I4__OBJECT__SZARRAY_U1__I4__I4__I4__I4__BYREF_SZARRAY_U1); + NANOCLR_NATIVE_DECLARE(sendto___STATIC__I4__OBJECT__SZARRAY_U1__I4__I4__I4__I4__SystemNetEndPoint); + NANOCLR_NATIVE_DECLARE(recvfrom___STATIC__I4__OBJECT__SZARRAY_U1__I4__I4__I4__I4__BYREF_SystemNetEndPoint); NANOCLR_NATIVE_DECLARE(getpeername___STATIC__VOID__OBJECT__BYREF_SZARRAY_U1); NANOCLR_NATIVE_DECLARE(getsockname___STATIC__VOID__OBJECT__BYREF_SZARRAY_U1); NANOCLR_NATIVE_DECLARE(getsockopt___STATIC__VOID__OBJECT__I4__I4__SZARRAY_U1); @@ -207,7 +210,7 @@ struct Library_sys_net_native_System_Net_Sockets_NativeSocket NANOCLR_NATIVE_DECLARE(ioctl___STATIC__VOID__OBJECT__U4__BYREF_U4); //--// - static HRESULT MarshalSockAddress( struct SOCK_sockaddr* addrDst, CLR_UINT32& addrLenDst, const CLR_RT_HeapBlock& blkSrc ); + static HRESULT MarshalSockAddress( struct SOCK_sockaddr* addrDst, CLR_UINT32& addrLenDst, const CLR_RT_HeapBlock& blkEndPointAddress ); static HRESULT MarshalSockAddress( CLR_RT_HeapBlock& blkDst, const struct SOCK_sockaddr* addrSrc, CLR_UINT32 addrLenSrc ); static HRESULT SendRecvHelper( CLR_RT_StackFrame& stack, bool fSend, bool fAddress ); static HRESULT SockOptHelper( CLR_RT_StackFrame& stack, bool fGet ); @@ -215,7 +218,7 @@ struct Library_sys_net_native_System_Net_Sockets_NativeSocket static HRESULT BindConnectHelper( CLR_RT_StackFrame& stack, bool fBind ); static HRESULT ThrowOnError( CLR_RT_StackFrame& stack, CLR_INT32 err ); static void ThrowError( CLR_RT_StackFrame& stack, CLR_INT32 errorCode ); - + static CLR_INT32 Helper__SelectSocket( CLR_INT32 socket, CLR_INT32 mode ); /* WARNING!!! @@ -232,10 +235,12 @@ struct Library_sys_net_native_System_Net_Sockets_Socket static const int FIELD__m_Handle = 1; static const int FIELD__m_fBlocking = 2; static const int FIELD__m_localEndPoint = 3; - static const int FIELD___remoteEndPoint = 4; - static const int FIELD__m_recvTimeout = 5; - static const int FIELD__m_sendTimeout = 6; - static const int FIELD___socketType = 7; + static const int FIELD__m_recvTimeout = 4; + static const int FIELD__m_sendTimeout = 5; + static const int FIELD___socketType = 6; + static const int FIELD___nonBlockingConnectInProgress = 7; + static const int FIELD___nonBlockingConnectRightEndPoint = 8; + static const int FIELD___rightEndPoint = 9; //--// diff --git a/src/DeviceInterfaces/System.Net/sys_net_native_System_Net_Sockets_NativeSocket.cpp b/src/DeviceInterfaces/System.Net/sys_net_native_System_Net_Sockets_NativeSocket.cpp index eb2c456ee0..9fafb7670b 100644 --- a/src/DeviceInterfaces/System.Net/sys_net_native_System_Net_Sockets_NativeSocket.cpp +++ b/src/DeviceInterfaces/System.Net/sys_net_native_System_Net_Sockets_NativeSocket.cpp @@ -7,9 +7,6 @@ #include "sys_net_native.h" -// FIXME - Check if required, for now just ignore -#define SwapEndianIfBEc16(x) (x) - HRESULT Library_sys_net_native_System_Net_Sockets_NativeSocket::socket___STATIC__I4__I4__I4__I4( CLR_RT_StackFrame& stack ) { NANOCLR_HEADER(); @@ -29,17 +26,18 @@ HRESULT Library_sys_net_native_System_Net_Sockets_NativeSocket::socket___STATIC_ NANOCLR_NOCLEANUP(); } -HRESULT Library_sys_net_native_System_Net_Sockets_NativeSocket::bind___STATIC__VOID__OBJECT__SZARRAY_U1( CLR_RT_StackFrame& stack ) +HRESULT Library_sys_net_native_System_Net_Sockets_NativeSocket::bind___STATIC__VOID__OBJECT__SystemNetEndPoint( CLR_RT_StackFrame& stack ) { NANOCLR_HEADER(); return BindConnectHelper( stack, true ); NANOCLR_NOCLEANUP_NOLABEL(); } -HRESULT Library_sys_net_native_System_Net_Sockets_NativeSocket::connect___STATIC__VOID__OBJECT__SZARRAY_U1__BOOLEAN( CLR_RT_StackFrame& stack ) +HRESULT Library_sys_net_native_System_Net_Sockets_NativeSocket::connect___STATIC__VOID__OBJECT__SystemNetEndPoint__BOOLEAN( CLR_RT_StackFrame& stack ) { NANOCLR_HEADER(); return BindConnectHelper( stack, false ); + NANOCLR_NOCLEANUP_NOLABEL(); } @@ -290,13 +288,13 @@ HRESULT Library_sys_net_native_System_Net_Sockets_NativeSocket::shutdown___STATI NANOCLR_NOCLEANUP(); } -HRESULT Library_sys_net_native_System_Net_Sockets_NativeSocket::sendto___STATIC__I4__OBJECT__SZARRAY_U1__I4__I4__I4__I4__SZARRAY_U1( CLR_RT_StackFrame& stack ) +HRESULT Library_sys_net_native_System_Net_Sockets_NativeSocket::sendto___STATIC__I4__OBJECT__SZARRAY_U1__I4__I4__I4__I4__SystemNetEndPoint( CLR_RT_StackFrame& stack ) { NATIVE_PROFILE_CLR_NETWORK(); return SendRecvHelper( stack, true, true ); } -HRESULT Library_sys_net_native_System_Net_Sockets_NativeSocket::recvfrom___STATIC__I4__OBJECT__SZARRAY_U1__I4__I4__I4__I4__BYREF_SZARRAY_U1( CLR_RT_StackFrame& stack ) +HRESULT Library_sys_net_native_System_Net_Sockets_NativeSocket::recvfrom___STATIC__I4__OBJECT__SZARRAY_U1__I4__I4__I4__I4__BYREF_SystemNetEndPoint( CLR_RT_StackFrame& stack ) { NATIVE_PROFILE_CLR_NETWORK(); return SendRecvHelper( stack, false, true ); @@ -335,7 +333,6 @@ HRESULT Library_sys_net_native_System_Net_Sockets_NativeSocket::poll___STATIC__B CLR_INT32 handle; CLR_INT32 mode = stack.Arg1().NumericByRef().s4; CLR_INT32 timeout_us = stack.Arg2().NumericByRef().s4; -// uint64_t ct = 0; CLR_RT_HeapBlock hbTimeout; CLR_INT32 res = 0; @@ -420,6 +417,7 @@ HRESULT Library_sys_net_native_System_Net_Sockets_NativeSocket::BindConnectHelpe NANOCLR_HEADER(); CLR_RT_HeapBlock* socket = stack.Arg0().Dereference(); + CLR_INT32 handle; SOCK_sockaddr addr; CLR_UINT32 addrLen = sizeof(addr); @@ -492,7 +490,6 @@ CLR_INT32 Library_sys_net_native_System_Net_Sockets_NativeSocket::Helper__Select exceptfds = &fdsExcept; } - timeval.tv_sec = 0; timeval.tv_usec = 0; @@ -509,65 +506,109 @@ CLR_INT32 Library_sys_net_native_System_Net_Sockets_NativeSocket::Helper__Select } return res; - } HRESULT Library_sys_net_native_System_Net_Sockets_NativeSocket::MarshalSockAddress( CLR_RT_HeapBlock& blkDst, const struct SOCK_sockaddr* addrSrc, CLR_UINT32 addrLenSrc ) { NATIVE_PROFILE_CLR_NETWORK(); + NANOCLR_HEADER(); - CLR_RT_HeapBlock_Array* arr = NULL; + (void)addrLenSrc; - CLR_RT_HeapBlock blkArr; blkArr.SetObjectReference( NULL ); - CLR_RT_ProtectFromGC gc( blkArr ); - SOCK_sockaddr_in* dst; SOCK_sockaddr_in* src = (SOCK_sockaddr_in*)addrSrc; - - NANOCLR_CHECK_HRESULT(CLR_RT_HeapBlock_Array::CreateInstance( blkArr, addrLenSrc, g_CLR_RT_WellKnownTypes.m_UInt8 )); - - arr = blkArr.DereferenceArray(); - _ASSERTE(arr); + CLR_RT_TypeDef_Index ipAddressTypeDef; + CLR_RT_TypeDef_Index ipEndPointTypeDef; + CLR_RT_HeapBlock* ipAddressHbObj; + CLR_RT_HeapBlock* ipEndPointHbObj; + + CLR_RT_HeapBlock ipAddress; ipAddress.SetObjectReference( NULL ); + CLR_RT_ProtectFromGC gc1( ipAddress ); + + CLR_RT_HeapBlock ipEndPoint; ipEndPoint.SetObjectReference( NULL ); + CLR_RT_ProtectFromGC gc2( ipEndPoint ); + + // find type definition, don't bother checking the result as it exists for sure + g_CLR_RT_TypeSystem.FindTypeDef( "IPAddress", "System.Net", ipAddressTypeDef ); + + // create an instance of + NANOCLR_CHECK_HRESULT(g_CLR_RT_ExecutionEngine.NewObjectFromIndex(ipAddress, ipAddressTypeDef)); - dst = (SOCK_sockaddr_in*)arr->GetFirstElement(); + // find type definition, don't bother checking the result as it exists for sure + g_CLR_RT_TypeSystem.FindTypeDef( "IPEndPoint", "System.Net", ipEndPointTypeDef ); - dst->sin_family = SwapEndianIfBEc16(src->sin_family); - dst->sin_port = src->sin_port; - dst->sin_addr.S_un.S_addr = src->sin_addr.S_un.S_addr; + // create an instance of + NANOCLR_CHECK_HRESULT(g_CLR_RT_ExecutionEngine.NewObjectFromIndex(ipEndPoint, ipEndPointTypeDef)); - memcpy(dst->sin_zero, src->sin_zero, sizeof(dst->sin_zero)); + // dereference the objects in order to reach their fields + ipAddressHbObj = ipAddress.Dereference(); + ipEndPointHbObj = ipEndPoint.Dereference(); - _ASSERTE(blkDst.DataType() == DATATYPE_BYREF || blkDst.DataType() == DATATYPE_ARRAY_BYREF); + { + // get a reference to the managed fields and set them + + // IPAddress _address field + // CLR_INT64 fields need to be accessed by pointer + CLR_RT_HeapBlock& addressFieldRef = ipAddressHbObj[ Library_sys_net_native_System_Net_IPAddress::FIELD___address ]; + CLR_INT64* pRes = (CLR_INT64*)&addressFieldRef.NumericByRef().s8; + *pRes = src->sin_addr.S_un.S_addr; + + // IPAddress _family field + ipAddressHbObj[ Library_sys_net_native_System_Net_IPAddress::FIELD___family ].NumericByRef().s4 = src->sin_family; + + // IPEndPoint _port field + // take care of endianess swapping + ipEndPointHbObj[ Library_sys_net_native_System_Net_IPEndPoint::FIELD___port ].NumericByRef().s4 = SOCK_ntohs(src->sin_port); + + // set IPEndPoint address with IPAddress heap block object + ipEndPointHbObj[ Library_sys_net_native_System_Net_IPEndPoint::FIELD___address ].SetObjectReference( ipAddressHbObj ); + } - NANOCLR_CHECK_HRESULT(blkArr.StoreToReference( blkDst, 0 )); + _ASSERTE(blkDst.DataType() == DATATYPE_BYREF); + + // store the new IPEndPoint object to reference + NANOCLR_CHECK_HRESULT(ipEndPoint.StoreToReference( blkDst, 0 )); NANOCLR_NOCLEANUP(); } -HRESULT Library_sys_net_native_System_Net_Sockets_NativeSocket::MarshalSockAddress( struct SOCK_sockaddr* addrDst, CLR_UINT32& addrLen, const CLR_RT_HeapBlock& blkSockAddress ) +HRESULT Library_sys_net_native_System_Net_Sockets_NativeSocket::MarshalSockAddress( struct SOCK_sockaddr* addrDst, CLR_UINT32& addrLenDst, const CLR_RT_HeapBlock& blkEndPointAddress ) { NATIVE_PROFILE_CLR_NETWORK(); NANOCLR_HEADER(); - CLR_RT_HeapBlock_Array* ptrSockAddress; SOCK_sockaddr_in* dst = (SOCK_sockaddr_in*)addrDst; - SOCK_sockaddr_in* src; - ptrSockAddress = blkSockAddress.DereferenceArray(); - FAULT_ON_NULL(ptrSockAddress); + CLR_RT_HeapBlock* endPointAddress; + CLR_RT_HeapBlock* remoteEndPointAddress; + int64_t address; + int32_t port; + + endPointAddress = blkEndPointAddress.Dereference(); + FAULT_ON_NULL(endPointAddress); + + // get a pointer to the managed field object instance for m_Address + remoteEndPointAddress = endPointAddress[ Library_sys_net_native_System_Net_IPEndPoint::FIELD___address ].Dereference(); + FAULT_ON_NULL(remoteEndPointAddress); - if(ptrSockAddress->m_numOfElements > addrLen) NANOCLR_SET_AND_LEAVE(CLR_E_INVALID_PARAMETER); + // get value of m_Address field (type long) + address = (CLR_INT64)remoteEndPointAddress[ Library_sys_net_native_System_Net_IPAddress::FIELD___address ].NumericByRef().s8; - src = (SOCK_sockaddr_in*)ptrSockAddress->GetFirstElement(); + // get value of m_Port field (type int) + port = endPointAddress[ Library_sys_net_native_System_Net_IPEndPoint::FIELD___port ].NumericByRef().s4; - dst->sin_family = SwapEndianIfBEc16(src->sin_family); - dst->sin_port = src->sin_port; - dst->sin_addr.S_un.S_addr = src->sin_addr.S_un.S_addr; //already in network byte order + // clear struct + memset(dst, 0, sizeof(SOCK_sockaddr)); - memcpy(dst->sin_zero, src->sin_zero, sizeof(dst->sin_zero)); + dst->sin_family = SOCK_AF_INET; + // need to convert port number to network order + dst->sin_port = SOCK_htons(port); - addrLen = ptrSockAddress->m_numOfElements; + //address already in network byte order + memcpy((int8_t*)&dst->sin_addr.S_un.S_addr, (int8_t*)&address, sizeof(address)); + + addrLenDst = sizeof(address); NANOCLR_NOCLEANUP(); } @@ -583,7 +624,6 @@ HRESULT Library_sys_net_native_System_Net_Sockets_NativeSocket::SendRecvHelper( CLR_UINT32 offset = stack.Arg2().NumericByRef().u4; CLR_UINT32 count = stack.Arg3().NumericByRef().u4; CLR_INT32 flags = stack.Arg4().NumericByRef().s4; -// CLR_INT32 timeout_ms = stack.Arg5().NumericByRef().s4; CLR_RT_HeapBlock hbTimeout; CLR_INT64* timeout; @@ -807,7 +847,6 @@ HRESULT Library_sys_net_native_System_Net_Sockets_NativeSocket::SockNameHelper( NANOCLR_NOCLEANUP(); } - void Library_sys_net_native_System_Net_Sockets_NativeSocket::ThrowError( CLR_RT_StackFrame& stack, CLR_INT32 errorCode ) { NATIVE_PROFILE_CLR_NETWORK(); @@ -834,4 +873,4 @@ HRESULT Library_sys_net_native_System_Net_Sockets_NativeSocket::ThrowOnError( CL } NANOCLR_NOCLEANUP(); -} \ No newline at end of file +} diff --git a/src/PAL/Include/nanoPAL_Sockets.h b/src/PAL/Include/nanoPAL_Sockets.h index 427fb56823..9d4e3d0cf6 100644 --- a/src/PAL/Include/nanoPAL_Sockets.h +++ b/src/PAL/Include/nanoPAL_Sockets.h @@ -433,15 +433,10 @@ enum UpdateOperation //--// -#if defined(NETMF_TARGET_LITTLE_ENDIAN) #define SOCK_htons(x) ( (((x) & 0x000000FFUL) << 8) | (((x) & 0x0000FF00UL) >> 8) ) #define SOCK_htonl(x) ( (((x) & 0x000000FFUL) << 24) | (((x) & 0x0000FF00UL) << 8) | (((x) & 0x00FF0000UL) >> 8) | (((x) & 0xFF000000UL) >> 24) ) #define SOCK_ntohs(x) SOCK_htons(x) -#else -#define SOCK_htons(x) ( x ) -#define SOCK_htonl(x) ( x ) -#define SOCK_ntohs(x) ((UINT16)(x)) -#endif +#define SOCK_ntohl(x) ( (((x) & 0x000000FFUL) << 24) | (((x) & 0x0000FF00UL) << 8) | (((x) & 0x00FF0000UL) >> 8) | (((x) & 0xFF000000UL) >> 24) ) #define SOCK_FD_ZERO(x) memset(x, 0, sizeof(*x)) __inline bool SOCK_FD_ISSET(int y, SOCK_fd_set* x)