static int php_sockop_close(php_stream *stream, int close_handle TSRMLS_DC)
{
php_netstream_data_t *sock = (php_netstream_data_t*)stream->abstract;
+ fd_set wrfds, efds;
+ int n;
if (close_handle) {
#if HAVE_OPENSSL_EXT
}
#endif
- /* shutdown(sock->socket, 0); */
+ /* prevent more data from coming in */
+ shutdown(sock->socket, SHUT_RD);
+
+ /* make sure that the OS sends all data before we close the connection */
+ do {
+ FD_ZERO(&wrfds);
+ FD_SET(sock->socket, &wrfds);
+ efds = wrfds;
+
+ n = select(sock->socket + 1, NULL, &wrfds, &efds, NULL);
+ } while (n == -1 && php_socket_errno() == EINTR);
+
closesocket(sock->socket);
}
# undef FD_SETSIZE
# include "arpa/inet.h"
# define socklen_t unsigned int
+# define SHUT_RD SD_RECEIVE
+# define SHUT_WR SD_SEND
+# define SHUT_RDWR SD_BOTH
#else
# undef closesocket
# define closesocket close
#include <sys/socket.h>
#endif
+/* These are here, rather than with the win32 counterparts above,
+ * since <sys/socket.h> defines them. */
+#ifndef SHUT_RD
+# define SHUT_RD 0
+# define SHUT_WR 1
+# define SHUT_RDWR 2
+#endif
+
#ifdef HAVE_SYS_TIME_H
#include <sys/time.h>
#endif