misalign = sizeof(char *) - pos%sizeof(char *);
if(misalign < sizeof(char *))
pos += misalign;
-
+
/* leave space for pointer list */
p = h->h_aliases;
char **h_aliases = (char **)(buffer + pos);
while(*(p++) != 0)
pos += sizeof(char *);
-
+
/* copy aliases and fill new pointer list */
for (p = h->h_aliases, q = h_aliases; *p != 0; p++, q++)
{
unsigned int misalign = sizeof(char *) - pos%sizeof(char *);
if(misalign < sizeof(char *))
pos += misalign;
-
+
/* leave space for pointer list */
char **p = s->s_aliases, **q;
char **s_aliases = (char **)(buffer + pos);
while(*(p++) != 0)
pos += sizeof(char *);
-
+
/* copy addresses and fill new pointer list */
for (p = s->s_aliases, q = s_aliases; *p != 0; p++, q++){
len = strlen(*p);
/* If socket has been created, shutdown it */
if (m_fd != INVALID_SOCKET)
{
- shutdown(m_fd, 2);
+ shutdown(m_fd, 1);
Close();
}
/* FreeBSD variants can't use MSG_NOSIGNAL, and instead use a socket option */
#ifdef SO_NOSIGPIPE
- setsockopt(m_fd, SOL_SOCKET, SO_NOSIGPIPE, (const char*)&arg, sizeof(u_long));
+ setsockopt(m_fd, SOL_SOCKET, SO_NOSIGPIPE, (const char*)&arg, sizeof(arg));
#endif
ioctl(m_fd, FIONBIO, &arg);
*/
if (m_reusable)
{
- setsockopt(m_fd, SOL_SOCKET, SO_REUSEADDR, (const char*)&arg, sizeof(u_long));
+ setsockopt(m_fd, SOL_SOCKET, SO_REUSEADDR, (const char*)&arg, sizeof(arg));
#ifdef SO_REUSEPORT
- setsockopt(m_fd, SOL_SOCKET, SO_REUSEPORT, (const char*)&arg, sizeof(u_long));
+ setsockopt(m_fd, SOL_SOCKET, SO_REUSEPORT, (const char*)&arg, sizeof(arg));
#endif
}
/* FreeBSD variants can't use MSG_NOSIGNAL, and instead use a socket option */
#ifdef SO_NOSIGPIPE
- setsockopt(m_fd, SOL_SOCKET, SO_NOSIGPIPE, (const char*)&arg, sizeof(u_long));
+ setsockopt(m_fd, SOL_SOCKET, SO_NOSIGPIPE, (const char*)&arg, sizeof(arg));
#endif
#if defined(__EMX__) || defined(__VISAGECPP__)
// If the reuse flag is set, use the applicable socket reuse flags(s)
if (m_reusable)
{
- setsockopt(m_fd, SOL_SOCKET, SO_REUSEADDR, (const char*)&arg, sizeof(u_long));
+ setsockopt(m_fd, SOL_SOCKET, SO_REUSEADDR, (const char*)&arg, sizeof(arg));
#ifdef SO_REUSEPORT
- setsockopt(m_fd, SOL_SOCKET, SO_REUSEPORT, (const char*)&arg, sizeof(u_long));
+ setsockopt(m_fd, SOL_SOCKET, SO_REUSEPORT, (const char*)&arg, sizeof(arg));
#endif
}
#endif
gs_gui_functions->Enable_Events(this);
+ if (m_reusable)
+ {
+ setsockopt(m_fd, SOL_SOCKET, SO_REUSEADDR, (const char*)&arg, sizeof(arg));
+#ifdef SO_REUSEPORT
+ setsockopt(m_fd, SOL_SOCKET, SO_REUSEPORT, (const char*)&arg, sizeof(arg));
+#endif
+ }
+
/* Bind to the local address,
* and retrieve the actual address bound.
*/
else
ret = Recv_Dgram(buffer, size);
- /* If recv returned zero, then the connection is lost, and errno is not set.
+ /* If recv returned zero, then the connection has been gracefully closed.
* Otherwise, recv has returned an error (-1), in which case we have lost the
* socket only if errno does _not_ indicate that there may be more data to read.
*/
if (ret == 0)
{
- m_error = GSOCK_IOERR;
+ /* Make sure wxSOCKET_LOST event gets sent and shut down the socket */
m_detected = GSOCK_LOST_FLAG;
- Close();
- // Signal an error for return
- return -1;
+ Detected_Read();
+ return 0;
}
else if (ret == -1)
{
{
/* This is a TCP server socket that detected a connection.
While the INPUT_FLAG is also set, it doesn't matter on
- this kind of sockets, as we can only Accept() from them. */
+ this kind of sockets, as we can only Accept() from them. */
result |= GSOCK_CONNECTION_FLAG;
m_detected |= GSOCK_CONNECTION_FLAG;
}