[Common-dev] CR: part 3: sockimp connect failure fix plus related host byte-order fix, etc.
Liam Murray liamm at real.com[Sorry, this has evolved into a big CR with a lot of small changes.]
Summary:
----------------
Misc. accumulated fixes to common/netio and client/common/netio. Mostly
socket option updates, a byte order fix and connect failure fix.
Details:
-----------
In addition to changes in previous CRs, this adds the following modifications:
1) Eric Hyche suggested in response to my last CR that SetAddr() take only
host order arguments. I agree that we should only use host order whenever
possible. Now only one method in hxsockutil accepts net-order arguments and
has been renamed to SetAddrNetOrder. This is used in cases where we get an
inet_addr or some other bsd struct and are creating an IHXSockAddr. If only
we used strings for address and port representation we could avoid all
these net/host order problems. :)
2) Updates (mostly to shim socket code) to only store and pass arguments in
host order; removed net order/host order conversions. Removed unused (and
duplicated i HXSockUtil) function
CHXClientNetServicesShim::CreateSocketAddress().
3) Small fix in HXSockUtil::SetAddr() which would likely crash in very
unlikely case that FromCharArray fails.
4) Added HX_SOCKOPT_READBUF_FLAG socket option. Value can be one of following.
HX_SOCK_READBUF_SIZE_DEFAULT
HX_SOCK_READBUF_SIZE_COPY // copy to precisely sized buffer after read
HX_SOCK_READBUF_SIZE_PEEK // use FIONBIO or equivalent (not implemented)
Note that if HX_SOCK_READBUF_SIZE_PEEK were to work reliably across
platforms HX_SOCK_READBUF_SIZE_COPY may not be needed. However, I'm not at
this point sure it is reliably supported and efficient.
6) Added HX_SOCKOPT_READBUF_MAX socket option. Value is a number that
specifies override value for m_mss (otherwise defaults to approx. 64K for
UDP and max segment size or 1500 for TCP)
7) Set DEFAULT_UDP_READ_SIZE to 0xf000 if symbian defined in hxnet.h.
8) Added some code to GetOption to return currently set values for missing
HXSockOpt that were recently added.
9) Split hxclientsockimp.cpp in client/common/netio/platform/posix into
two files chxclientsocket.cpp and chxclientnetservices.cpp for sake of
cleaner organization.
As a reminder, this also includes the following items from previous CRs:
1) Net order fix in hxsockutil
2) Moved IHXScheduler assert so it only asserts when socket idle timeout
option is used (otherwise asserts when using simple context objects such as
mini context)
3) Fix in sockimp to better handle connect failure. When a connect fails a
write event is passed to OnEvent(). If an error is associated with the
event the connect event is forwarded to IHXSocketResponse with the error
code and no write event is subsequently sent. The first write event is only
sent if the connection is successful. (This is how WSA event semantics
works. Please verify this makes sense for us to follow.) Also note that a
close event should not be sent unless a connection was successfully
established for a socket. (Again, this corresponds with WSA semantics.)
4) When the windows client gets an FD_CONNECT along with a failure code
from WSAAsyncSelect, it is passed on as a write event to
CHXSocket::OnEvent(). Otherwise the connect is passed on upon receiving the
first write event.
5) Changed CHXSocket::Init() so it returns an HX_RESULT. This is
particularly helpful for the client derivations because they
initialize/allocate resources during initialization.
Branch: HEAD
Builds, platforms verified: Windows client
Liam
Index: hxnet.h
===================================================================
RCS file: /cvsroot/common/include/hxnet.h,v
retrieving revision 1.22
diff -u -w -r1.22 hxnet.h
--- hxnet.h 30 Jul 2004 20:53:56 -0000 1.22
+++ hxnet.h 7 Aug 2004 00:40:25 -0000
@@ -82,10 +82,12 @@
// Default read size for all other sockets when MSS is unavailable
+#if defined SYMBIAN
+#define DEFAULT_UDP_READ_SIZE 0xf000
+#else
#define DEFAULT_UDP_READ_SIZE 0xffff
+#endif
-// SYMBIAN requires DEFAULT_UDP_READ_SIZE <= 0xf000
-// SO_MAX_MSG_SIZE for windows?
/******************************************************************************
*
@@ -433,12 +435,17 @@
#define HX_SOCK_EVENT_ALL (~0)
-typedef enum
-{
- HX_SOCKBUF_DEFAULT, // IHXBuffer
- HX_SOCKBUF_TIMESTAMPED // IHXTimeStampedBuffer
+typedef enum {
+ HX_SOCKBUF_DEFAULT, /* IHXBuffer */
+ HX_SOCKBUF_TIMESTAMPED /* IHXTimeStampedBuffer */
} HXSockBufType;
+typedef enum {
+ HX_SOCK_READBUF_SIZE_DEFAULT, /* read once into default sized read
buffer */
+ HX_SOCK_READBUF_SIZE_COPY, /* same as default but reallocates
once size is known */
+ HX_SOCK_READBUF_SIZE_PEEK /* use facility such as FIONBIO to
determine size of pending data in network buffers */
+} HXSockReadBufFlag;
+
/* Socket options for IHXSocket::GetOption() and IHXSocket::SetOption() */
/* XXXTDM: Separate these like the real getsockopt/setsockopt? */
typedef enum {
@@ -494,9 +501,11 @@
HX_SOCKOPT_IDLETIMEOUT,
/* Helix only*/
- HX_SOCKOPT_BUFFER_TYPE,
- HX_SOCKOPT_APP_SNDBUF,
- HX_SOCKOPT_APP_RCVBUF,
+ HX_SOCKOPT_BUFFER_TYPE, /* IHXBuffer type returned from read
functions */
+ HX_SOCKOPT_APP_SNDBUF, /* outbound app buffer size in bytes*/
+ HX_SOCKOPT_APP_RCVBUF, /* inbound app buffer size in bytes*/
+ HX_SOCKOPT_READBUF_FLAG, /* controls read buffer allocation and
sizing behavior */
+ HX_SOCKOPT_READBUF_MAX, /* max read buffer size in bytes (datagram
and stream) */
HX_SOCKOPT_LAST
} HXSockOpt;
Index: hxsockutil.cpp
===================================================================
RCS file: /cvsroot/common/netio/hxsockutil.cpp,v
retrieving revision 1.12
diff -u -w -r1.12 hxsockutil.cpp
--- hxsockutil.cpp 30 Jul 2004 19:58:18 -0000 1.12
+++ hxsockutil.cpp 7 Aug 2004 00:38:00 -0000
@@ -42,6 +42,7 @@
#include "safestring.h"
#include "debug.h"
#include "hxassert.h"
+#include "netbyte.h"
#include "hxheap.h"
#include "hxsockutil.h"
@@ -254,12 +255,14 @@
}
-HX_RESULT HXSockUtil::SetAddr(IHXSockAddr* pAddr /*modified*/, const char*
pAddrString, UINT16 port)
+HX_RESULT HXSockUtil::SetAddr(IHXSockAddr* pAddr /*modified*/,
+ const char* pAddrString,
+ UINT16 port)
{
HX_ASSERT(pAddr);
HX_ASSERT(pAddrString);
- IHXBuffer* pBuf;
+ IHXBuffer* pBuf = 0;
HX_RESULT hr = CHXBuffer::FromCharArray(pAddrString, &pBuf);
if (HXR_OK == hr)
{
@@ -268,22 +271,21 @@
{
hr = pAddr->SetPort(port);
}
- }
HX_RELEASE(pBuf);
+ }
+
return hr;
}
-HX_RESULT HXSockUtil::SetAddr(IHXSockAddr* pAddr /*modified*/,
+HX_RESULT HXSockUtil::SetAddrNetOrder(IHXSockAddr* pAddr /*modified*/,
short family,
- const void* pAddrData /*net-order
octets/hextets*/,
- UINT16 port)
+ const void* pAddrData /*net order
octets/hextets*/,
+ UINT16 port /*net order*/)
{
HX_ASSERT(pAddrData);
-
char szAddr[HX_ADDRSTRLEN]; // big enough for ipv6 and ipv4
hx_inet_ntop(family, pAddrData, szAddr, HX_ADDRSTRLEN);
-
- return SetAddr(pAddr, szAddr, port);
+ return SetAddr(pAddr, szAddr, WToHost(port));
}
@@ -449,10 +451,9 @@
}
-
HX_RESULT HXSockUtil::CreateAddrIN4(IHXNetServices* pNetServices,
- UINT32 addr /*net order*/,
- UINT16 port /*net order*/,
+ UINT32 addr,
+ UINT16 port,
IHXSockAddr*& pAddrOut /*out*/)
{
HX_ASSERT(pNetServices);
@@ -461,7 +462,9 @@
HX_RESULT hr = pNetServices->CreateSockAddr(HX_SOCK_FAMILY_IN4,
&pAddrOut);
if(SUCCEEDED(hr))
{
- SetAddr(pAddrOut, AF_INET, &addr, port);
+ UINT32 netAddr = DwToNet(addr);
+ UINT16 netPort = WToNet(port);
+ SetAddrNetOrder(pAddrOut, AF_INET, &netAddr, netPort);
}
return hr;
Index: platform/posix/hxposixsockutil.cpp
===================================================================
RCS file: /cvsroot/common/netio/platform/posix/hxposixsockutil.cpp,v
retrieving revision 1.3
diff -u -w -r1.3 hxposixsockutil.cpp
--- platform/posix/hxposixsockutil.cpp 21 Jul 2004 23:10:33 -0000 1.3
+++ platform/posix/hxposixsockutil.cpp 7 Aug 2004 00:38:00 -0000
@@ -40,12 +40,13 @@
#include "hxslist.h"
#include "safestring.h"
#include "sockimp.h"
-#include "debug.h"
-#include "hxassert.h"
-#include "hxheap.h"
+#include "netbyte.h"
#include "hxsockutil.h"
#include "hxposixsockutil.h"
+#include "debug.h"
+#include "hxassert.h"
+#include "hxheap.h"
#ifdef _DEBUG
#undef HX_THIS_FILE
static const char HX_THIS_FILE[] = __FILE__;
@@ -66,7 +67,7 @@
HX_RESULT hr = pNetServices->CreateSockAddr(HX_SOCK_FAMILY_IN6,
&pAddrOut);
if (SUCCEEDED(hr))
{
- HXSockUtil::SetAddr(pAddrOut, AF_INET6, &psa->sin6_addr,
psa->sin6_port);
+ HXSockUtil::SetAddrNetOrder(pAddrOut, AF_INET6, &psa->sin6_addr,
psa->sin6_port);
}
return hr;
@@ -96,7 +97,14 @@
{
HX_ASSERT(pNetServices);
HX_ASSERT(psa);
- return HXSockUtil::CreateAddrIN4(pNetServices, psa->sin_addr.s_addr,
psa->sin_port, pAddrOut);
+
+ HX_RESULT hr = pNetServices->CreateSockAddr(HX_SOCK_FAMILY_IN4,
&pAddrOut);
+ if(SUCCEEDED(hr))
+ {
+ hr = HXSockUtil::SetAddrNetOrder(pAddrOut, AF_INET,
&psa->sin_addr.s_addr, psa->sin_port);
+ }
+
+ return hr;
}
@@ -151,8 +159,8 @@
IHXSockAddr* pAddr = 0;
- const char* psz = phe->h_addr_list[idx];
- if (!psz)
+ const char* pAddrOctets = phe->h_addr_list[idx];
+ if (!pAddrOctets)
{
// end of list
break;
@@ -160,9 +168,9 @@
HX_ASSERT(phe->h_length == sizeof(UINT32));
- UINT32 addr = *(const UINT32*)(psz);
+ UINT32 addr = *(const UINT32*)(pAddrOctets);
- hr = HXSockUtil::CreateAddrIN4(pNetServices, addr, 0, pAddr);
+ hr = HXSockUtil::CreateAddrIN4(pNetServices, WToHost(addr), 0,
pAddr);
if (HXR_OK == hr)
{
HX_ASSERT(pAddr != 0);
Index: platform/posix/sockimp.cpp
===================================================================
RCS file: /cvsroot/common/netio/platform/posix/sockimp.cpp,v
retrieving revision 1.37
diff -u -w -r1.37 sockimp.cpp
--- platform/posix/sockimp.cpp 30 Jul 2004 20:32:57 -0000 1.37
+++ platform/posix/sockimp.cpp 7 Aug 2004 00:38:00 -0000
@@ -1005,6 +1005,7 @@
m_type(HX_SOCK_TYPE_NONE),
m_proto(HX_SOCK_PROTO_NONE),
m_bufType(HX_SOCKBUF_DEFAULT),
+ m_readBufFlag(HX_SOCK_READBUF_SIZE_DEFAULT),
m_sock(HX_SOCK_NONE),
#if defined(MISSING_DUALSOCKET)
m_pSock4(NULL),
@@ -1034,7 +1035,6 @@
}
HX_ASSERT(m_punkContext != NULL);
HX_ASSERT(m_pCCF != NULL);
- HX_ASSERT(m_pScheduler != NULL);
}
CHXSocket::CHXSocket(CHXNetServices* pNetSvc, IUnknown* punkContext,
@@ -1077,7 +1077,6 @@
}
HX_ASSERT(m_punkContext != NULL);
HX_ASSERT(m_pCCF != NULL);
- HX_ASSERT(m_pScheduler != NULL);
}
CHXSocket::~CHXSocket(void)
@@ -1141,28 +1140,32 @@
break;
case HX_SOCK_STATE_CONNECTING:
HX_ASSERT(uEvent & HX_SOCK_EVENT_WRITE);
- m_sock.state = HX_SOCK_STATE_NORMAL; //XXXTDM: What if connect fails?
-
- if (m_uSelectedEventMask & HX_SOCK_EVENT_CONNECT)
+ if (uEvent & HX_SOCK_EVENT_WRITE)
{
UINT32 err = 0;
- HX_RESULT status;
hx_getsockopt(&m_sock, HX_SOCKOPT_SOCKERR, &err);
- status = ErrorToStatus(err);
+ HX_RESULT status = ErrorToStatus(err);
+
+ // NB: we shouldn't send a close event unless the connection
is successful
+ m_sock.state = HX_SOCK_STATE_NORMAL;
+
if (m_uSelectedEventMask & HX_SOCK_EVENT_CONNECT)
{
m_pResponse->EventPending(HX_SOCK_EVENT_CONNECT, status);
}
- }
- //XXXTDM: Pass up write event on failed connect?
- if (m_uSelectedEventMask & HX_SOCK_EVENT_WRITE)
- {
+
HX_ASSERT(m_bIsResponseWriteEventPending);
m_bIsResponseWriteEventPending = FALSE;
+
+ // only send the write event if the connection was
successfully established
+ if (HXR_OK == status && m_uSelectedEventMask &
HX_SOCK_EVENT_WRITE)
+ {
m_pResponse->EventPending(HX_SOCK_EVENT_WRITE, HXR_OK);
}
+ }
break;
case HX_SOCK_STATE_LISTENING:
+ HX_ASSERT(uEvent & HX_SOCK_EVENT_READ);
if (uEvent & HX_SOCK_EVENT_READ)
{
m_uPendingEventMask = HX_SOCK_EVENT_ACCEPT;
@@ -1702,11 +1705,31 @@
*pval = m_uIdleTimeout;
return HXR_OK;
}
- if (name == HX_SOCKOPT_BUFFER_TYPE)
+ else if (name == HX_SOCKOPT_BUFFER_TYPE)
{
*pval = m_bufType;
return HXR_OK;
}
+ else if (name == HX_SOCKOPT_READBUF_FLAG)
+ {
+ *pval = m_readBufFlag;
+ return HXR_OK;
+ }
+ else if (name == HX_SOCKOPT_READBUF_MAX)
+ {
+ *pval = m_mss;
+ return HXR_OK;
+ }
+ else if (name == HX_SOCKOPT_APP_SNDBUF)
+ {
+ *pval = 0;
+ if (m_pSendBuffer)
+ {
+ *pval = m_pSendBuffer->GetSize();
+ }
+ return HXR_OK;
+ }
+
if (hx_getsockopt(&m_sock, name, pval) != 0)
{
@@ -1743,6 +1766,7 @@
#endif
if (name == HX_SOCKOPT_IDLETIMEOUT)
{
+ HX_ASSERT(m_pScheduler);
if (m_pScheduler == NULL)
{
return HXR_FAIL;
@@ -1759,12 +1783,33 @@
}
return HXR_OK;
}
- if (name == HX_SOCKOPT_BUFFER_TYPE)
+ else if (name == HX_SOCKOPT_BUFFER_TYPE)
{
+ if (val != HX_SOCKBUF_DEFAULT &&
+ val != HX_SOCKBUF_TIMESTAMPED)
+ {
+ return HXR_FAIL;
+ }
m_bufType = (HXSockBufType)val;
return HXR_OK;
}
- if (name == HX_SOCKOPT_APP_SNDBUF)
+ else if (name == HX_SOCKOPT_READBUF_FLAG)
+ {
+ if (val != HX_SOCK_READBUF_SIZE_DEFAULT &&
+ val != HX_SOCK_READBUF_SIZE_COPY)
+ {
+ return HXR_FAIL;
+ }
+ m_readBufFlag = (HXSockReadBufFlag)val;
+
+ return HXR_OK;
+ }
+ else if (name == HX_SOCKOPT_READBUF_MAX)
+ {
+ m_mss = val;
+ return HXR_OK;
+ }
+ else if (name == HX_SOCKOPT_APP_SNDBUF)
{
if (m_pSendBuffer)
{
@@ -1773,6 +1818,7 @@
return HXR_OK;
}
+
if (hx_setsockopt(&m_sock, name, val) != 0)
{
return ErrorToStatus(hx_lastsockerr());
@@ -2003,6 +2049,7 @@
return HXR_UNEXPECTED;
}
+
HX_RESULT
CHXSocket::GetNativeAddr(IHXSockAddr* pAddr, sockaddr_in6* psa6,
sockaddr** ppsa, size_t* psalen)
@@ -2025,6 +2072,48 @@
}
HX_RESULT
+CHXSocket::SetReadBufferSize(IHXBuffer** ppBuf /*modified*/, UINT32 cbRead)
+{
+ HX_ASSERT(ppBuf && *ppBuf);
+ HX_ASSERT(cbRead != 0);
+
+ HX_RESULT hxr = HXR_OK;
+
+ //XXXLCM If we get rid of the following line and 'copy' is specified
we can allocate
+ // one temp buffer into which we read and avoid some extra
allocations.
+ if (cbRead != (*ppBuf)->GetSize())
+ {
+ HX_ASSERT(cbRead < (*ppBuf)->GetSize());
+ if (HX_SOCK_READBUF_SIZE_COPY == m_readBufFlag)
+ {
+ // allocate a new buffer so buffer does not waste unused
memory space
+ IHXBuffer* pResizedBuf = 0;
+ hxr = CreateReadBuffer(&pResizedBuf);
+ if (HXR_OK == hxr)
+ {
+ hxr = pResizedBuf->Set((*ppBuf)->GetBuffer(), cbRead);
+ if (HXR_OK == hxr)
+ {
+ HX_RELEASE(*ppBuf);
+ *ppBuf = pResizedBuf;
+ (*ppBuf)->AddRef();
+ }
+ HX_RELEASE(pResizedBuf);
+ }
+ }
+ else
+ {
+ HX_ASSERT(HX_SOCK_READBUF_SIZE_DEFAULT == m_readBufFlag);
+ // just re-specify the size and avoid a copy
+ hxr = (*ppBuf)->SetSize(cbRead);
+ }
+ }
+
+ return hxr;
+}
+
+
+HX_RESULT
CHXSocket::CreateReadBuffer(IHXBuffer** ppBuf)
{
HX_RESULT hxr = HXR_OK;
@@ -2116,7 +2205,7 @@
n = hx_readfrom(&m_sock, (*ppBuf)->GetBuffer(), m_mss, psa,
salen, bPeek);
if (n > 0)
{
- (*ppBuf)->SetSize(n);
+ hxr = SetReadBufferSize(ppBuf, n);
}
else if (n == 0)
{
@@ -2247,7 +2336,11 @@
}
else if (vec[n].get_len() < ppBufVec[n]->GetSize())
{
- ppBufVec[n]->SetSize(vec[n].get_len());
+ hxr = SetReadBufferSize(&ppBufVec[n], vec[n].get_len());
+ if (FAILED(hxr))
+ {
+ return hxr;
+ }
}
}
return HXR_OK;
@@ -2767,7 +2860,7 @@
Close();
}
-void
+HX_RESULT
CHXNetServices::Init(IUnknown* punkContext)
{
m_punkContext = punkContext;
@@ -2775,10 +2868,12 @@
//XXXLCM this loads then unloads the winsock dll (undesireable)
HXNetDrvLoader loader;
- if(HXR_OK == loader.EnsureLoaded())
+ HX_RESULT hr = loader.EnsureLoaded();
+ if (HXR_OK == hr)
{
m_bIN6 = hx_netdrv_familyavail(HX_SOCK_FAMILY_IN6);
}
+ return hr;
}
void
Index: platform/win/hxsocketselector.cpp
===================================================================
RCS file: /cvsroot/common/netio/platform/win/hxsocketselector.cpp,v
retrieving revision 1.6
diff -u -w -r1.6 hxsocketselector.cpp
--- platform/win/hxsocketselector.cpp 30 Jul 2004 22:57:10 -0000 1.6
+++ platform/win/hxsocketselector.cpp 7 Aug 2004 00:38:00 -0000
@@ -229,12 +229,6 @@
wsaMask |= TranlateMaskValue(eventMask,
HX_SOCK_EVENT_WRITE, FD_WRITE);
wsaMask |= TranlateMaskValue(eventMask,
HX_SOCK_EVENT_CLOSE, FD_CLOSE);
- if(!m_wsaEventSemantics)
- {
- // we only will report HX_SOCK_EVENT_READ and HX_SOCK_EVENT_WRITE
as on UNIX
- wsaMask &= ~FD_CONNECT;
- }
-
// register to receive async socket event notifications
int res = WSAAsyncSelect(fd, m_pMsgSink->GetSinkHandle(),
HXMSG_SOCKETSELECT, wsaMask);
if( SOCKET_ERROR != res )
@@ -412,7 +406,7 @@
}
-UINT32 HXSocketSelector::TranslateWSAAsyncSelectEvent(UINT16 wsaEvent)
+UINT32 TranslateWSAAsyncSelectEvent(bool wsaEventSemantics, UINT16
wsaEvent, UINT16 err)
{
UINT32 hxEvent = HX_SOCK_EVENT_NONE;
switch (wsaEvent)
@@ -446,11 +440,15 @@
// applications you do not need to handle this; you just wait
// for the write event.
//
- HX_ASSERT(m_wsaEventSemantics);
- if (m_wsaEventSemantics)
+ if (wsaEventSemantics)
{
hxEvent = HX_SOCK_EVENT_CONNECT;
}
+ else if(err != 0)
+ {
+ // pass write event along with error code
+ hxEvent = HX_SOCK_EVENT_WRITE;
+ }
break;
case FD_CLOSE:
@@ -458,7 +456,7 @@
// Indicates that stream socket has transitioned to close-pending
// state (either gracefully or abortively) from connected state
//
- if(m_wsaEventSemantics)
+ if(wsaEventSemantics)
{
hxEvent = HX_SOCK_EVENT_CLOSE;
}
@@ -478,7 +476,7 @@
//
// Helix synthesizes HX_SOCK_EVENT_ACCEPT based on HX_SOCK_EVENT_READ
//
- if(m_wsaEventSemantics)
+ if(wsaEventSemantics)
{
hxEvent = HX_SOCK_EVENT_ACCEPT;
}
@@ -525,13 +523,16 @@
if(pHandler)
{
- UINT32 hxEvent = TranslateWSAAsyncSelectEvent(event);
+ UINT32 hxEvent = TranslateWSAAsyncSelectEvent(m_wsaEventSemantics,
event, err);
HX_RESULT hxResult = TranslateWSAAsyncSelectError(err);
DPRINTF(D_SOCKETSELECT, ("HXSocketSelector::OnAsyncSelect():
%s:%s translated as %s(= %u) for handler [%p]\n",
GetWSAEventString(event), GetWSAErrorString(err),
GetSockEventString(hxEvent), hxEvent, pHandler));
+ if (HX_SOCK_EVENT_NONE != hxEvent)
+ {
pHandler->OnSelectEvent(hxEvent, hxResult);
+ }
}
else
{
Index: pub/hxsockutil.h
===================================================================
RCS file: /cvsroot/common/netio/pub/hxsockutil.h,v
retrieving revision 1.9
diff -u -w -r1.9 hxsockutil.h
--- pub/hxsockutil.h 30 Jul 2004 19:58:45 -0000 1.9
+++ pub/hxsockutil.h 7 Aug 2004 00:38:00 -0000
@@ -12,9 +12,11 @@
struct HXSockUtil // namespace
{
- static HX_RESULT SetAddr(IHXSockAddr* pAddr /*modified*/, const char*
pAddrString, UINT16 port);
-
static HX_RESULT SetAddr(IHXSockAddr* pAddr /*modified*/,
+ const char* pAddrString,
+ UINT16 port = 0);
+
+ static HX_RESULT SetAddrNetOrder(IHXSockAddr* pAddr /*modified*/,
short family,
const void* const pAddrData /*net
order*/,
UINT16 port /*net order*/ = 0);
@@ -28,10 +30,9 @@
const char* pszAddr, UINT16 port,
IHXSockAddr*& pAddrOut /*out*/);
-
static HX_RESULT CreateAddrIN4(IHXNetServices* pNetServices,
- UINT32 addr /*net order*/,
- UINT16 port /*net order*/,
+ UINT32 addr,
+ UINT16 port,
IHXSockAddr*& pAddrOut /*out*/);
Index: pub/platform/posix/sockimp.h
===================================================================
RCS file: /cvsroot/common/netio/pub/platform/posix/sockimp.h,v
retrieving revision 1.23
diff -u -w -r1.23 sockimp.h
--- pub/platform/posix/sockimp.h 30 Jul 2004 00:32:32 -0000 1.23
+++ pub/platform/posix/sockimp.h 7 Aug 2004 00:38:00 -0000
@@ -302,6 +302,7 @@
sockaddr** ppsa, size_t* psalen);
HX_RESULT ErrorToStatus(int err);
HX_RESULT CreateReadBuffer(IHXBuffer** ppBuf);
+ HX_RESULT SetReadBufferSize(IHXBuffer** ppBuf /*modified*/, UINT32
cbRead);
HX_RESULT DoRead(IHXBuffer** ppBuf, IHXSockAddr** ppAddr = NULL,
BOOL bPeek = FALSE);
HX_RESULT DoWrite(IHXBuffer* pBuf,
@@ -336,6 +337,7 @@
HXSockType m_type;
HXSockProtocol m_proto;
HXSockBufType m_bufType;
+ HXSockReadBufFlag m_readBufFlag;
HX_SOCK m_sock;
#if defined(MISSING_DUALSOCKET)
CHXSocket* m_pSock4;
@@ -441,7 +443,7 @@
virtual ~CHXNetServices(void);
public:
- virtual void Init(IUnknown* punkContext);
+ virtual HX_RESULT Init(IUnknown* punkContext);
virtual void Close(void);
// This is used by CHXSocket::Accept().
Index: pub/platform/win/hxsocketselector.h
===================================================================
RCS file: /cvsroot/common/netio/pub/platform/win/hxsocketselector.h,v
retrieving revision 1.5
diff -u -w -r1.5 hxsocketselector.h
--- pub/platform/win/hxsocketselector.h 30 Jul 2004 22:57:30 -0000 1.5
+++ pub/platform/win/hxsocketselector.h 7 Aug 2004 00:38:00 -0000
@@ -81,7 +81,6 @@
HXSocketSelector();
virtual ~HXSocketSelector();
static HX_RESULT CreateSelector(HXSocketSelector*& pSelector);
- UINT32 TranslateWSAAsyncSelectEvent(UINT16 wsaEvent);
// HXRefCounted
void FinalRelease();
Index: platform/posix/shim_listening_socket.cpp
===================================================================
RCS file:
/cvsroot/client/common/netio/platform/posix/shim_listening_socket.cpp,v
retrieving revision 1.4
diff -u -w -r1.4 shim_listening_socket.cpp
--- platform/posix/shim_listening_socket.cpp 30 Jul 2004 20:49:43 -0000 1.4
+++ platform/posix/shim_listening_socket.cpp 7 Aug 2004 00:49:33 -0000
@@ -280,14 +280,6 @@
retVal = pTCPSocket->GetForeignPort(usPort);
if (SUCCEEDED(retVal))
{
- // Since HXSockUtil::CreateAddrIN4 expects both
- // address and port in net order, then if we
- // are little-endian, we need to swap them.
- if (!m_bBigEndian)
- {
- ulAddr = CHXShimUtils::SwapUINT32(ulAddr);
- usPort = CHXShimUtils::SwapUINT16(usPort);
- }
// Create an IHXSockAddr with these parameters
IHXSockAddr* pAddr = NULL;
retVal = HXSockUtil::CreateAddrIN4(m_pNetServices,
ulAddr, usPort, pAddr);
Index: platform/posix/shim_net_services.cpp
===================================================================
RCS file: /cvsroot/client/common/netio/platform/posix/shim_net_services.cpp,v
retrieving revision 1.5
diff -u -w -r1.5 shim_net_services.cpp
--- platform/posix/shim_net_services.cpp 30 Jul 2004 20:49:43 -0000 1.5
+++ platform/posix/shim_net_services.cpp 7 Aug 2004 00:49:33 -0000
@@ -40,7 +40,7 @@
#include "hxprefs.h"
#include "hxprefutil.h"
#include "hxengin.h"
-#include "hxclientsockimp.h"
+//#include "chxclientsocket.h"
#include "hxsockutil.h"
#include "shim_resolve.h"
#include "shim_listening_socket.h"
@@ -56,10 +56,12 @@
{
}
-void CHXClientNetServicesShim::Init(IUnknown* pContext)
+HX_RESULT CHXClientNetServicesShim::Init(IUnknown* pContext)
{
- CHXNetServices::Init(pContext);
+ HX_RESULT hr = CHXNetServices::Init(pContext);
+ if (HXR_OK == hr)
+ {
// Get the IHXPreferences interface
if(m_punkContext)
{
@@ -73,6 +75,9 @@
HX_RELEASE(pPrefs);
}
}
+ return hr;
+
+}
void CHXClientNetServicesShim::Close(void)
{
@@ -160,35 +165,6 @@
else
{
retVal = CHXClientNetServices::CreateSocket(ppSock);
- }
-
- return retVal;
-}
-
-HX_RESULT CHXClientNetServicesShim::CreateSocketAddress(IHXNetServices*
pNetServices,
- UINT32
ulAddress,
- UINT16
usPort,
- IHXSockAddr**
ppAddr)
-{
- HX_RESULT retVal = HXR_FAIL;
-
- if (pNetServices && ppAddr)
- {
- IHXSockAddr* pAddr = NULL;
- retVal = pNetServices->CreateSockAddr(HX_SOCK_FAMILY_IN4, &pAddr);
- if (SUCCEEDED(retVal))
- {
- // Set the address and port
- HXSockUtil::SetAddr(pAddr, AF_INET, &ulAddress, usPort);
- if (SUCCEEDED(retVal))
- {
- // AddRef the IHXSockAddr before it goes out
- pAddr->AddRef();
- // Return the out parameter
- *ppAddr = pAddr;
- }
- }
- HX_RELEASE(pAddr);
}
return retVal;
Index: platform/posix/shim_resolve.cpp
===================================================================
RCS file: /cvsroot/client/common/netio/platform/posix/shim_resolve.cpp,v
retrieving revision 1.3
diff -u -w -r1.3 shim_resolve.cpp
--- platform/posix/shim_resolve.cpp 23 Jul 2004 21:14:29 -0000 1.3
+++ platform/posix/shim_resolve.cpp 7 Aug 2004 00:49:33 -0000
@@ -164,13 +164,7 @@
{
// Convert the service port to an UINT16 (native order)
m_usServicePort = (UINT16) atoi(pServ);
- // HXSockUtil::CreateAddrIN4 expects the port to
- // be in net order, so if we are little-endian, then
- // we need to swap
- if (!m_bBigEndian)
- {
- m_usServicePort = CHXShimUtils::SwapUINT16(m_usServicePort);
- }
+
// Call IHXResolver::GetHostByName(). This will
// return in GetHostByNameDone().
retVal = m_pResolver->GetHostByName(pNode);
@@ -196,12 +190,7 @@
if (SUCCEEDED(status))
{
// IHXResolverResponse returns address in native order.
- // HXSockUtil::CreateAddrIN4() expects addresses in
- // net order, so if we are little-endian, we need to swap
- if (!m_bBigEndian)
- {
- ulAddr = CHXShimUtils::SwapUINT32(ulAddr);
- }
+
// Create an IHXSockAddr with this address and port
IHXSockAddr* pAddr = NULL;
retVal = HXSockUtil::CreateAddrIN4(m_pServices, ulAddr,
m_usServicePort, pAddr);
Index: platform/posix/shim_socket.cpp
===================================================================
RCS file: /cvsroot/client/common/netio/platform/posix/shim_socket.cpp,v
retrieving revision 1.6
diff -u -w -r1.6 shim_socket.cpp
--- platform/posix/shim_socket.cpp 30 Jul 2004 20:49:43 -0000 1.6
+++ platform/posix/shim_socket.cpp 7 Aug 2004 00:49:33 -0000
@@ -328,13 +328,6 @@
retVal = m_pTCPSocket->GetLocalPort(usPort);
if (SUCCEEDED(retVal))
{
- // CreateAddrIN4 expects net order, so if
- // we are little-endian, then we need to swap
- if (!m_bBigEndian)
- {
- ulAddr = CHXShimUtils::SwapUINT32(ulAddr);
- usPort = CHXShimUtils::SwapUINT16(usPort);
- }
IHXSockAddr* pAddr = NULL;
retVal = HXSockUtil::CreateAddrIN4(m_pNetServices,
ulAddr, usPort, pAddr);
if (SUCCEEDED(retVal))
@@ -354,12 +347,6 @@
retVal = m_pTCPSocket->GetLocalPort(usPort);
if (SUCCEEDED(retVal))
{
- // CreateAddrIN4 expects net order, so if
- // we are little-endian, then we need to swap
- if (!m_bBigEndian)
- {
- usPort = CHXShimUtils::SwapUINT16(usPort);
- }
IHXSockAddr* pAddr = NULL;
retVal = HXSockUtil::CreateAddrIN4(m_pNetServices,
ulAddr, usPort, pAddr);
if (SUCCEEDED(retVal))
@@ -393,13 +380,6 @@
retVal = m_pTCPSocket->GetForeignPort(usPort);
if (SUCCEEDED(retVal))
{
- // CreateAddrIN4 expects net order, so if
- // we are little-endian, then we need to swap
- if (!m_bBigEndian)
- {
- ulAddr = CHXShimUtils::SwapUINT32(ulAddr);
- usPort = CHXShimUtils::SwapUINT16(usPort);
- }
IHXSockAddr* pAddr = NULL;
retVal = HXSockUtil::CreateAddrIN4(m_pNetServices,
ulAddr, usPort, pAddr);
if (SUCCEEDED(retVal))
@@ -548,22 +528,16 @@
if (pGroupAddr && pInterface && m_pUDPSocket)
{
- // Get the group address (net order)
+ // Get the group address (native order)
UINT32 ulGroupAddr = 0;
retVal = HXSockUtil::GetIN4Address(pGroupAddr, ulGroupAddr);
if (SUCCEEDED(retVal))
{
- // Get the interface address (net order)
+ // Get the interface address (native order)
UINT32 ulInterfaceAddr = 0;
retVal = HXSockUtil::GetIN4Address(pInterface, ulInterfaceAddr);
if (SUCCEEDED(retVal))
{
- // If little-endian, we need to convert to native
- if (!m_bBigEndian)
- {
- ulGroupAddr = CHXShimUtils::SwapUINT32(ulGroupAddr);
- ulInterfaceAddr =
CHXShimUtils::SwapUINT32(ulInterfaceAddr);
- }
retVal = m_pUDPSocket->JoinMulticastGroup(ulGroupAddr,
ulInterfaceAddr);
}
}
@@ -588,12 +562,6 @@
retVal = HXSockUtil::GetIN4Address(pInterface, ulInterfaceAddr);
if (SUCCEEDED(retVal))
{
- // If little-endian, we need to convert to native
- if (!m_bBigEndian)
- {
- ulGroupAddr = CHXShimUtils::SwapUINT32(ulGroupAddr);
- ulInterfaceAddr =
CHXShimUtils::SwapUINT32(ulInterfaceAddr);
- }
retVal = m_pUDPSocket->LeaveMulticastGroup(ulGroupAddr,
ulInterfaceAddr);
}
}
@@ -825,13 +793,7 @@
// Save the UDP read address and port
m_ulUDPReadAddress = ulAddr;
m_usUDPReadPort = nPort;
- // The address and port are in native byte order. If
- // we are little-endian, then we need to swap them
- if (!m_bBigEndian)
- {
- m_ulUDPReadAddress =
CHXShimUtils::SwapUINT32(m_ulUDPReadAddress);
- m_usUDPReadPort =
CHXShimUtils::SwapUINT16(m_usUDPReadPort);
- }
+
// Init the buffer offset
m_ulLastReadOffset = 0;
// Schedule a callback to send the HX_SOCK_EVENT_READ event
@@ -1102,11 +1064,16 @@
retVal = CreateSockAddr(&pAddr);
if (SUCCEEDED(retVal))
{
- // We saved the address and port from
- // IHXUDPSocketResponse::ReadFrom() and have
- // already converted them to net order. Now
- // we need to set these into the address
- HXSockUtil::SetAddr(pAddr, AF_INET, &m_ulUDPReadAddress,
m_usUDPReadPort);
+ // Convert address and port from native to net order
+ UINT32 ulAddr = m_ulUDPReadAddress;
+ UINT16 usPort = m_usUDPReadPort;
+ if (!m_bBigEndian)
+ {
+ ulAddr = CHXShimUtils::SwapUINT32(ulAddr);
+ usPort = CHXShimUtils::SwapUINT16(usPort);
+ }
+ // Set these into the address
+ HXSockUtil::SetAddrNetOrder(pAddr, AF_INET, &ulAddr, usPort);
// Now read the buffer
IHXBuffer* pBuffer = NULL;
retVal = DoRead(&pBuffer, bPeek);
Index: win.pcf
===================================================================
RCS file: /cvsroot/client/common/netio/win.pcf,v
retrieving revision 1.9
diff -u -w -r1.9 win.pcf
--- win.pcf 19 Jul 2004 23:18:18 -0000 1.9
+++ win.pcf 7 Aug 2004 00:49:33 -0000
@@ -53,7 +53,8 @@
project.AddSources("platform/win/hxnetif.cpp",
"platform/posix/chxresolver.cpp",
- "platform/posix/hxclientsockimp.cpp")
+ "platform/posix/chxclientsocket.cpp",
+ "platform/posix/chxclientnetservices.cpp")
project.AddSources("platform/posix/shim_utils.cpp",