Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Work on sockets #1345

Merged
merged 1 commit into from
Jun 4, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 15 additions & 7 deletions src/DeviceInterfaces/System.Net/sys_net_native.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -157,18 +161,21 @@ 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,
Library_sys_net_native_System_Net_Sockets_NativeSocket::listen___STATIC__VOID__OBJECT__I4,
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,
Expand Down Expand Up @@ -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 }
};
31 changes: 18 additions & 13 deletions src/DeviceInterfaces/System.Net/sys_net_native.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;


//--//
Expand All @@ -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;


//--//
Expand Down Expand Up @@ -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;


//--//
Expand All @@ -188,17 +191,17 @@ 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);
NANOCLR_NATIVE_DECLARE(listen___STATIC__VOID__OBJECT__I4);
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);
Expand All @@ -207,15 +210,15 @@ 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 );
static HRESULT SockNameHelper( CLR_RT_StackFrame& stack, bool fPeer );
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!!!
Expand All @@ -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;


//--//
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -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();
}

Expand Down Expand Up @@ -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 );
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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;

Expand All @@ -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 <IPAddress> 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 <IPAddress>
NANOCLR_CHECK_HRESULT(g_CLR_RT_ExecutionEngine.NewObjectFromIndex(ipAddress, ipAddressTypeDef));

dst = (SOCK_sockaddr_in*)arr->GetFirstElement();
// find <IPEndPoint> 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 <IPEndPoint>
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();
}
Expand All @@ -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;
Expand Down Expand Up @@ -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();
Expand All @@ -834,4 +873,4 @@ HRESULT Library_sys_net_native_System_Net_Sockets_NativeSocket::ThrowOnError( CL
}

NANOCLR_NOCLEANUP();
}
}
7 changes: 1 addition & 6 deletions src/PAL/Include/nanoPAL_Sockets.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down