diff options
author | Mike Buland <eichlan@xagasoft.com> | 2009-01-16 23:55:53 +0000 |
---|---|---|
committer | Mike Buland <eichlan@xagasoft.com> | 2009-01-16 23:55:53 +0000 |
commit | 8c1f4d7bace6ff2c99d546cedaba890b349e88f8 (patch) | |
tree | e5c6e29deaaa7db42fbc75d0fdef32457bb0c8f2 /src/serversocket.cpp | |
parent | 0a43e790cf9798948ab989abe88f890813c935df (diff) | |
download | libbu++-8c1f4d7bace6ff2c99d546cedaba890b349e88f8.tar.gz libbu++-8c1f4d7bace6ff2c99d546cedaba890b349e88f8.tar.bz2 libbu++-8c1f4d7bace6ff2c99d546cedaba890b349e88f8.tar.xz libbu++-8c1f4d7bace6ff2c99d546cedaba890b349e88f8.zip |
I...think that's a little better. Wow, function pointers in windows have a
lot of problems. This may require a little more research, but basically, you
can't just call them inline wherever you'd like. I managed to get it to work
by providing simple one line wrapper functions for each function we acquired as
a pointer. Crazy mess. Anyway, it should load the library just once now, and
Bu::Socket looks a little bit cleaner, but not a heck of a lot.
I also added some more docs and removed the author references.
Diffstat (limited to 'src/serversocket.cpp')
-rw-r--r-- | src/serversocket.cpp | 29 |
1 files changed, 12 insertions, 17 deletions
diff --git a/src/serversocket.cpp b/src/serversocket.cpp index 946d0d3..89fef7e 100644 --- a/src/serversocket.cpp +++ b/src/serversocket.cpp | |||
@@ -24,6 +24,7 @@ | |||
24 | #include "bu/serversocket.h" | 24 | #include "bu/serversocket.h" |
25 | #include "bu/osx_compatibility.h" | 25 | #include "bu/osx_compatibility.h" |
26 | #include "bu/win32_compatibility.h" | 26 | #include "bu/win32_compatibility.h" |
27 | #include "bu/linux_compatibility.h" | ||
27 | 28 | ||
28 | namespace Bu { subExceptionDef( ServerSocketException ) } | 29 | namespace Bu { subExceptionDef( ServerSocketException ) } |
29 | 30 | ||
@@ -35,11 +36,11 @@ Bu::ServerSocket::ServerSocket( int nPort, int nPoolSize ) : | |||
35 | 36 | ||
36 | /* Give the socket a name. */ | 37 | /* Give the socket a name. */ |
37 | name.sin_family = AF_INET; | 38 | name.sin_family = AF_INET; |
38 | name.sin_port = DYNLOAD htons( nPort ); | 39 | name.sin_port = bu_htons( nPort ); |
39 | 40 | ||
40 | // I think this specifies who we will accept connections from, | 41 | // I think this specifies who we will accept connections from, |
41 | // a good thing to make configurable later on | 42 | // a good thing to make configurable later on |
42 | name.sin_addr.s_addr = DYNLOAD htonl( INADDR_ANY ); | 43 | name.sin_addr.s_addr = bu_htonl( INADDR_ANY ); |
43 | 44 | ||
44 | startServer( name, nPoolSize ); | 45 | startServer( name, nPoolSize ); |
45 | } | 46 | } |
@@ -53,10 +54,10 @@ Bu::ServerSocket::ServerSocket(const FString &sAddr,int nPort, int nPoolSize) : | |||
53 | /* Give the socket a name. */ | 54 | /* Give the socket a name. */ |
54 | name.sin_family = AF_INET; | 55 | name.sin_family = AF_INET; |
55 | 56 | ||
56 | name.sin_port = DYNLOAD htons( nPort ); | 57 | name.sin_port = bu_htons( nPort ); |
57 | 58 | ||
58 | #ifdef WIN32 | 59 | #ifdef WIN32 |
59 | name.sin_addr.s_addr = DYNLOAD inet_addr( sAddr.getStr() ); | 60 | name.sin_addr.s_addr = bu_inet_addr( sAddr.getStr() ); |
60 | #else | 61 | #else |
61 | inet_aton( sAddr.getStr(), &name.sin_addr ); | 62 | inet_aton( sAddr.getStr(), &name.sin_addr ); |
62 | #endif | 63 | #endif |
@@ -72,7 +73,7 @@ Bu::ServerSocket::~ServerSocket() | |||
72 | void Bu::ServerSocket::startServer( struct sockaddr_in &name, int nPoolSize ) | 73 | void Bu::ServerSocket::startServer( struct sockaddr_in &name, int nPoolSize ) |
73 | { | 74 | { |
74 | /* Create the socket. */ | 75 | /* Create the socket. */ |
75 | nServer = DYNLOAD socket( PF_INET, SOCK_STREAM, 0 ); | 76 | nServer = bu_socket( PF_INET, SOCK_STREAM, 0 ); |
76 | 77 | ||
77 | if( nServer < 0 ) | 78 | if( nServer < 0 ) |
78 | { | 79 | { |
@@ -80,7 +81,7 @@ void Bu::ServerSocket::startServer( struct sockaddr_in &name, int nPoolSize ) | |||
80 | } | 81 | } |
81 | 82 | ||
82 | int opt = 1; | 83 | int opt = 1; |
83 | DYNLOAD setsockopt( | 84 | bu_setsockopt( |
84 | nServer, | 85 | nServer, |
85 | SOL_SOCKET, | 86 | SOL_SOCKET, |
86 | SO_REUSEADDR, | 87 | SO_REUSEADDR, |
@@ -88,13 +89,12 @@ void Bu::ServerSocket::startServer( struct sockaddr_in &name, int nPoolSize ) | |||
88 | sizeof( opt ) | 89 | sizeof( opt ) |
89 | ); | 90 | ); |
90 | 91 | ||
91 | if( DYNLOAD bind( | 92 | if( bu_bind( nServer, (struct sockaddr *) &name, sizeof(name) ) < 0 ) |
92 | nServer, (struct sockaddr *) &name, sizeof(name) ) < 0 ) | ||
93 | { | 93 | { |
94 | throw Bu::ServerSocketException("Couldn't bind to the listen socket."); | 94 | throw Bu::ServerSocketException("Couldn't bind to the listen socket."); |
95 | } | 95 | } |
96 | 96 | ||
97 | if( DYNLOAD listen( nServer, nPoolSize ) < 0 ) | 97 | if( bu_listen( nServer, nPoolSize ) < 0 ) |
98 | { | 98 | { |
99 | throw Bu::ServerSocketException( | 99 | throw Bu::ServerSocketException( |
100 | "Couldn't begin listening to the server socket." | 100 | "Couldn't begin listening to the server socket." |
@@ -121,18 +121,14 @@ int Bu::ServerSocket::accept( int nTimeoutSec, int nTimeoutUSec ) | |||
121 | xT.tv_usec = nTimeoutUSec; | 121 | xT.tv_usec = nTimeoutUSec; |
122 | 122 | ||
123 | if( TEMP_FAILURE_RETRY( | 123 | if( TEMP_FAILURE_RETRY( |
124 | DYNLOAD select( nServer+1, &fdRead, NULL, NULL, &xT )) < 0 ) | 124 | bu_select( nServer+1, &fdRead, NULL, NULL, &xT )) < 0 ) |
125 | { | 125 | { |
126 | throw Bu::ServerSocketException( | 126 | throw Bu::ServerSocketException( |
127 | "Error scanning for new connections: %s", strerror( errno ) | 127 | "Error scanning for new connections: %s", strerror( errno ) |
128 | ); | 128 | ); |
129 | } | 129 | } |
130 | 130 | ||
131 | #ifdef WIN32 | ||
132 | if( DynamicWinsock2::DYN_FD_ISSET( nServer, &fdRead ) ) | ||
133 | #else | ||
134 | if( FD_ISSET( nServer, &fdRead ) ) | 131 | if( FD_ISSET( nServer, &fdRead ) ) |
135 | #endif | ||
136 | { | 132 | { |
137 | struct sockaddr_in clientname; | 133 | struct sockaddr_in clientname; |
138 | socklen_t size; | 134 | socklen_t size; |
@@ -140,8 +136,7 @@ int Bu::ServerSocket::accept( int nTimeoutSec, int nTimeoutUSec ) | |||
140 | 136 | ||
141 | size = sizeof( clientname ); | 137 | size = sizeof( clientname ); |
142 | #ifdef WIN32 | 138 | #ifdef WIN32 |
143 | nClient = DYNLOAD accept( | 139 | nClient = bu_accept( nServer, (struct sockaddr *)&clientname, &size); |
144 | nServer, (struct sockaddr *)&clientname, (int *)&size); | ||
145 | #else /* not-WIN32 */ | 140 | #else /* not-WIN32 */ |
146 | #ifdef __CYGWIN__ | 141 | #ifdef __CYGWIN__ |
147 | nClient = ::accept( nServer, (struct sockaddr *)&clientname, | 142 | nClient = ::accept( nServer, (struct sockaddr *)&clientname, |
@@ -189,7 +184,7 @@ int Bu::ServerSocket::accept( int nTimeoutSec, int nTimeoutUSec ) | |||
189 | // If iMode = 0, blocking is enabled; | 184 | // If iMode = 0, blocking is enabled; |
190 | // If iMode != 0, non-blocking mode is enabled. | 185 | // If iMode != 0, non-blocking mode is enabled. |
191 | u_long iMode = 1; | 186 | u_long iMode = 1; |
192 | DYNLOAD ioctlsocket(nClient, FIONBIO, &iMode); | 187 | bu_ioctlsocket(nClient, FIONBIO, &iMode); |
193 | #endif | 188 | #endif |
194 | } | 189 | } |
195 | 190 | ||