From f2de345f5e64ef7de971b1506d1ebd4832fa4b77 Mon Sep 17 00:00:00 2001 From: olsner Date: Mon, 8 Mar 2004 02:10:37 +0000 Subject: [PATCH] - Naming Convention changes - windows compat This was SVN commit r186. --- source/ps/Network/SocketBase.cpp | 42 ++++++++++++-------- source/ps/Network/SocketBase.h | 68 ++++++++++++++++++++------------ 2 files changed, 68 insertions(+), 42 deletions(-) diff --git a/source/ps/Network/SocketBase.cpp b/source/ps/Network/SocketBase.cpp index 68c04f19ef..9cb0ce57ea 100755 --- a/source/ps/Network/SocketBase.cpp +++ b/source/ps/Network/SocketBase.cpp @@ -1,4 +1,4 @@ -#include "SocketBase.h" +#include "Network.h" #include "NetworkInternal.h" #include "lib.h" @@ -13,8 +13,7 @@ DEFINE_ERROR(CONNECT_TIMEOUT, "The connection attempt timed out"); DEFINE_ERROR(CONNECT_REFUSED, "The connection attempt was refused"); DEFINE_ERROR(NO_ROUTE_TO_HOST, "No route to host"); DEFINE_ERROR(CONNECTION_BROKEN, "The connection has been closed"); -DEFINE_ERROR(CONNECT_IN_PROGRESS, "The connection attempt has started, but is not yet complete"); -// The conditions that may cause this errors are at least as obscure as the message +DEFINE_ERROR(CONNECT_IN_PROGRESS, "The connect attempt has started, but is not yet complete"); DEFINE_ERROR(PORT_IN_USE, "The port is already in use by another process"); DEFINE_ERROR(INVALID_PORT, "The port specified is either invalid, or forbidden by system or firewall policy"); DEFINE_ERROR(INVALID_PROTOCOL, "The socket type or protocol is not supported by the operating system. Make sure that the TCP/IP protocol is installed and activated"); @@ -40,7 +39,7 @@ PS_RESULT GetPS_RESULT(int error) } } -SocketAddress::SocketAddress(int port, SocketProtocol proto) +CSocketAddress::CSocketAddress(int port, ESocketProtocol proto) { memset(&m_Union, 0, sizeof(m_Union)); switch (proto) @@ -58,7 +57,7 @@ SocketAddress::SocketAddress(int port, SocketProtocol proto) } } -PS_RESULT SocketAddress::Resolve(const char *name, int port, SocketAddress &addr) +PS_RESULT CSocketAddress::Resolve(const char *name, int port, CSocketAddress &addr) { if ((getaddrinfo) != NULL) { @@ -104,7 +103,7 @@ PS_RESULT SocketAddress::Resolve(const char *name, int port, SocketAddress &addr } } -CStr SocketAddress::GetString() const +CStr CSocketAddress::GetString() const { char convBuf[NI_MAXHOST]; if ((getnameinfo) != NULL) @@ -133,7 +132,7 @@ CStr SocketAddress::GetString() const return CStr(); } -int SocketAddress::GetPort() const +int CSocketAddress::GetPort() const { switch (m_Union.m_Family) { @@ -190,7 +189,7 @@ void *WaitLoopThreadMain(void *) return NULL; } -PS_RESULT CSocketBase::Initialize(SocketProtocol proto) +PS_RESULT CSocketBase::Initialize(ESocketProtocol proto) { ONCE( pthread_create(&g_SocketSetInternal.m_Thread, NULL, WaitLoopThreadMain, NULL); @@ -213,12 +212,18 @@ PS_RESULT CSocketBase::Initialize(SocketProtocol proto) return PS_OK; } +void CSocketBase::Close() +{ + shutdown(m_pInternal->m_fd, SHUT_WR); + m_State=SS_CLOSED_LOCALLY; +} + void CSocketBase::Destroy() { if (m_pInternal->m_fd == -1) m_State=SS_UNCONNECTED; // Disconnect the socket, if it is still connected - if (m_State == SS_CONNECTED) + if (m_State == SS_CONNECTED || m_State == SS_CLOSED_LOCALLY) { // This makes the other end receive a RST, but since // we've had no chance to close cleanly and the socket must @@ -228,6 +233,7 @@ void CSocketBase::Destroy() } // Destroy the socket closesocket(m_pInternal->m_fd); + m_pInternal->m_fd=-1; } void CSocketBase::SetNonBlocking(bool nonblocking) @@ -309,7 +315,8 @@ PS_RESULT CSocketBase::Write(void *buf, uint len, uint *bytesWritten) if (res < 0) { *bytesWritten=0; - switch (Network_LastError) + int err=Network_LastError; + switch (err) { case EWOULDBLOCK: return PS_OK; @@ -322,8 +329,8 @@ PS_RESULT CSocketBase::Write(void *buf, uint len, uint *bytesWritten) case ETIMEDOUT: case EHOSTUNREACH:*/ default: - Network_GetErrorString(Network_LastError, errbuf, sizeof(errbuf)); - printf("Write error %s [%d]\n", errbuf, Network_LastError); + Network_GetErrorString(err, errbuf, sizeof(errbuf)); + printf("Write error %s [%d]\n", errbuf, err); m_State=SS_UNCONNECTED; return CONNECTION_BROKEN; } @@ -333,7 +340,7 @@ PS_RESULT CSocketBase::Write(void *buf, uint len, uint *bytesWritten) return PS_OK; } -PS_RESULT CSocketBase::Connect(const SocketAddress &addr) +PS_RESULT CSocketBase::Connect(const CSocketAddress &addr) { int res=connect(m_pInternal->m_fd, (struct sockaddr *)&addr, sizeof(addr)); @@ -357,7 +364,7 @@ PS_RESULT CSocketBase::Connect(const SocketAddress &addr) return m_Error; } -PS_RESULT CSocketBase::Bind(const SocketAddress &address) +PS_RESULT CSocketBase::Bind(const CSocketAddress &address) { char errBuf[256]; int res; @@ -404,7 +411,7 @@ PS_RESULT CSocketBase::Bind(const SocketAddress &address) return PS_OK; } -PS_RESULT CSocketBase::PreAccept(SocketAddress &addr) +PS_RESULT CSocketBase::PreAccept(CSocketAddress &addr) { socklen_t addrLen=sizeof(addr.m_Union); int fd=accept(m_pInternal->m_fd, (struct sockaddr *)&addr.m_Union, &addrLen); @@ -432,7 +439,7 @@ CSocketInternal *CSocketBase::Accept() void CSocketBase::Reject() { shutdown(m_pInternal->m_AcceptFd, SHUT_RDWR); - close(m_pInternal->m_AcceptFd); + closesocket(m_pInternal->m_AcceptFd); } // UNIX select loop @@ -700,6 +707,7 @@ void WaitLoop_SocketUpdateProc(int fd, int error, uint event) case FD_CLOSE: // If FD_CLOSE and error, OnClose has already been called above // with the appropriate PS_RESULT + pSock->m_State=SS_UNCONNECTED; pSock->OnClose(PS_OK); break; } @@ -715,7 +723,7 @@ LRESULT WINAPI WaitLoop_WindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lP int event=LOWORD(lParam); int error=HIWORD(lParam); - WaitLoop_SocketUpdateProc((int)wParam, error, event); + WaitLoop_SocketUpdateProc((int)wParam, error?error-WSABASEERR:0, event); return FALSE; } default: diff --git a/source/ps/Network/SocketBase.h b/source/ps/Network/SocketBase.h index 823e7273e4..a586354f42 100755 --- a/source/ps/Network/SocketBase.h +++ b/source/ps/Network/SocketBase.h @@ -39,10 +39,12 @@ class CSocketInternal; */ // Modifiers Note: Each value in the enum should correspond to a sockaddr_* // struct and a PF_* value -enum SocketProtocol +enum ESocketProtocol { // This should be a value that's invalid for most socket functions, so that // you don't accidentally use an UNSPEC SocketAddress + // PF_UNSPEC does not work, since it is accepted by many implementations as + // a "default" protocol family - whatever that may be UNSPEC=((sa_family_t)-1), IPv4=PF_INET, IPv6=PF_INET6, @@ -51,12 +53,12 @@ enum SocketProtocol /** * A protocol-independent representation of a socket address. All protocols - * in the SocketProtocol enum should have a corresponding member in this union. + * in the ESocketProtocol enum should have a corresponding member in this union. */ // Modifiers Note: Each member must contain a first field, compatible with the -// sin_family field of sockaddr_in. The field contains the SocketProtocol value +// sin_family field of sockaddr_in. The field contains the ESocketProtocol value // for the address, and it is returned by GetProtocol() -struct SocketAddress +struct CSocketAddress { union { @@ -65,12 +67,12 @@ struct SocketAddress sockaddr_in6 m_IPv6; } m_Union; - inline SocketProtocol GetProtocol() const + inline ESocketProtocol GetProtocol() const { - return (SocketProtocol)m_Union.m_Family; + return (ESocketProtocol)m_Union.m_Family; } - inline SocketAddress() + inline CSocketAddress() { memset(&m_Union, 0, sizeof(m_Union)); m_Union.m_Family=UNSPEC; @@ -83,7 +85,7 @@ struct SocketAddress * @param port The port number, in local byte order * @param proto The protocol to use; default IPv4 */ - explicit SocketAddress(int port, SocketProtocol proto=IPv4); + explicit CSocketAddress(int port, ESocketProtocol proto=IPv4); /** * Create an address from a numerical IPv4 address and port, port in local @@ -93,7 +95,7 @@ struct SocketAddress * @param address An IPv4 address as a byte array (in written order) * @param port A port number (0-65535) in local byte order. */ - SocketAddress(u8 address[4], int port); + CSocketAddress(u8 address[4], int port); /** * Resolve the name using the system name resolution service (i.e. DNS) and @@ -110,7 +112,7 @@ struct SocketAddress * @retval PS_OK The hostname was successfully retrieved * @retval NO_SUCH_HOST The hostname was not found */ - static PS_RESULT Resolve(const char *name, int port, SocketAddress &addr); + static PS_RESULT Resolve(const char *name, int port, CSocketAddress &addr); /** * Returns the string representation of the address, i.e. the IP (v4 or v6) @@ -127,11 +129,11 @@ struct SocketAddress }; /** - * An enumeration of the three socket states + * An enumeration of socket states * * @see CSocketBase::GetState() */ -enum SocketState +enum ESocketState { /** * The socket is unconnected. Use GetError() to see if it is due to a @@ -150,7 +152,13 @@ enum SocketState /** * The socket is connected. The error state will be set to PS_OK. */ - SS_CONNECTED + SS_CONNECTED, + /** + * The connection has been closed on this end, but the other end might have + * sent data that we haven't received yet. The error state will be set to + * PS_OK. + */ + SS_CLOSED_LOCALLY }; /** @@ -160,16 +168,16 @@ enum SocketState * classes * * Any CSocket subclass that can be Accept:ed by a CServerSocket should - * provide a constructor that takes a CSocketInternal pointer, and follows - * the semantics of the CSocket::CSocket(CSocketInternal *) constructor + * provide a constructor that takes a CSocketInternal pointer, and hands it to + * the base class constructor. */ class CSocketBase { private: CSocketInternal *m_pInternal; - SocketState m_State; + ESocketState m_State; PS_RESULT m_Error; - SocketProtocol m_Proto; + ESocketProtocol m_Proto; bool m_NonBlocking; /** @@ -220,7 +228,7 @@ protected: /** * Initialize a CSocketBase from a CSocketInternal pointer. Use in OnAccept * callbacks to create an object of your subclass. This constructor should - * be overloaded protected by any subclass that may be Accept:ed. + * be overloaded by any subclass that may be Accept:ed. */ CSocketBase(CSocketInternal *pInt); virtual ~CSocketBase(); @@ -276,7 +284,7 @@ public: * Returns the protocol set by Initialize. All SocketAddresses used with * the socket must have the same SocketProtocol */ - inline SocketProtocol GetProtocol() const + inline ESocketProtocol GetProtocol() const { return m_Proto; } /** @@ -285,10 +293,20 @@ public: */ void Destroy(); + /** + * Close the socket. No more data can be sent over the socket, but any data + * pending from the remote host will still be received, and the OnRead + * callback called (if the socket's op mask has the READ bit set). Note + * that the socket isn't actually closed until the remote end calls + * Close on the corresponding remote socket, upon which the OnClose + * callback is called with a status code of PS_OK. + */ + void Close(); + /** * Create the OS socket for the specified protocol type. */ - PS_RESULT Initialize(SocketProtocol proto=IPv4); + PS_RESULT Initialize(ESocketProtocol proto=IPv4); /** * Connect the socket to the specified address. The socket must be @@ -297,7 +315,7 @@ public: * @param addr The address to connect to * @see SocketAddress::Resolve */ - PS_RESULT Connect(const SocketAddress &addr); + PS_RESULT Connect(const CSocketAddress &addr); /** @name Functions for Server Sockets */ //@{ @@ -310,7 +328,7 @@ public: * @param addr The address to bind to * @see SocketAddress::SocketAddress(int,SocketProtocol) */ - PS_RESULT Bind(const SocketAddress &addr); + PS_RESULT Bind(const CSocketAddress &addr); /** * Store the address of the next incoming connection in the SocketAddress @@ -323,7 +341,7 @@ public: * @see Accept(SocketAddress&) * @see Reject() */ - PS_RESULT PreAccept(SocketAddress &addr); + PS_RESULT PreAccept(CSocketAddress &addr); /** * Accept the next incoming connection. You must construct a suitable @@ -378,7 +396,7 @@ public: * @see SocketState * @see GetError() */ - inline SocketState GetState() const + inline ESocketState GetState() const { return m_State; } /** @@ -391,7 +409,7 @@ public: * * @return A reference to the socket address */ - const SocketAddress &GetRemoteAddress(); + const CSocketAddress &GetRemoteAddress(); //@} /** @name Stream I/O */