stoddard 99/08/19 08:13:51
Modified: mpm/src/os/win32 iol_socket.c Log: New send, recv and writev implementations. These are a bit faster. Leaving the old routines in the file for now to experiment with. Revision Changes Path 1.3 +136 -2 apache-2.0/mpm/src/os/win32/iol_socket.c Index: iol_socket.c =================================================================== RCS file: /home/cvs/apache-2.0/mpm/src/os/win32/iol_socket.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- iol_socket.c 1999/08/18 15:09:37 1.2 +++ iol_socket.c 1999/08/19 15:13:50 1.3 @@ -208,7 +208,7 @@ }; #elif defined(IOL_SOCK_WIN32) - +/* static int win32_send(ap_iol *viol, const char *buf, int len) { int rv; @@ -268,7 +268,6 @@ return len; } - static int win32_recv( ap_iol *viol, const char *buf, int len) { int rv; @@ -334,6 +333,7 @@ return len; } + static int win32_writev(ap_iol *viol, const struct iovec *vec, int num) { int i; @@ -404,6 +404,140 @@ free(pWsaData); return len; +} +*/ +static int win32_send(ap_iol *viol, const char *buf, int len) +{ + int rv; + int lasterror; + int timeout; + iol_socket *iol = (iol_socket *)viol; + WSABUF wsaData; + + wsaData.len = len; + wsaData.buf = (const char*) buf; + + timeout = iol->timeout * 1000; /* setsockopt requires timeout in milliseconds */ + + rv = setsockopt(iol->fd, SOL_SOCKET, SO_SNDTIMEO, + (char*) &timeout, sizeof(timeout)); + if (rv != NO_ERROR) { + printf("win32send: setsockopt failed.\n"); + return -1; + } + do { + rv = WSASend(iol->fd, &wsaData, 1, &len, 0, NULL, NULL); + if (rv != SOCKET_ERROR) { + return len; + } + else { + lasterror = WSAGetLastError(); + } + } while (rv == SOCKET_ERROR && lasterror == WSAEINTR); + + /* TEST CODE + * If lasterror ==WSATIMEDOUT, then the connection timed out + */ + if (rv == SOCKET_ERROR && lasterror == WSAETIMEDOUT) { + printf("wsasend: Connection timed out\n"); + } else { + printf("Connection failed. lasterror = %d\n", lasterror); + } + + return -1; +} +static int win32_recv( ap_iol *viol, const char *buf, int len) +{ + int rv; + int lasterror; + int timeout; + iol_socket *iol = (iol_socket *)viol; + + WSABUF wsaData; + DWORD dwBytesRecv; + DWORD flags = 0; + + wsaData.len = len; + wsaData.buf = buf; + + timeout = iol->timeout * 1000; /* setsockopt requires timeout in milliseconds */ + + rv = setsockopt(iol->fd, SOL_SOCKET, SO_RCVTIMEO, + (char*) &timeout, sizeof(timeout)); + if (rv != NO_ERROR) { + printf("win32recv: setsockopt failed. errno = %d\n", WSAGetLastError()); + return -1; + } + do { + rv = WSARecv(iol->fd, &wsaData, 1, &dwBytesRecv, &flags, NULL, NULL); + if (rv != SOCKET_ERROR) { + return (int) dwBytesRecv; + } + else { + lasterror = WSAGetLastError(); + } + } while (rv == SOCKET_ERROR && lasterror == WSAEINTR); + + /* TEST CODE + * If lasterror ==WSATIMEDOUT, then the connection timed out + */ + if (rv == SOCKET_ERROR && lasterror == WSAETIMEDOUT) { + printf("wsarecv: Connection timed out\n"); + } else { + printf("Connection failed. lasterror = %d\n", lasterror); + } + + return -1; +} + +static int win32_writev(ap_iol *viol, const struct iovec *vec, int num) +{ + int i; + int rv; + int lasterror; + int len = 0; + int timeout; + iol_socket *iol = (iol_socket *)viol; + + LPWSABUF pWsaData = malloc(sizeof(WSABUF) * num); + if (!pWsaData) + return -1; + + for (i = 0; i < num; i++) { + pWsaData[i].buf = vec[i].iov_base; + pWsaData[i].len = vec[i].iov_len; + } + + timeout = iol->timeout * 1000; /* setsockopt requires timeout in milliseconds */ + + rv = setsockopt(iol->fd, SOL_SOCKET, SO_SNDTIMEO, + (char*) &timeout, sizeof(timeout)); + if (rv != NO_ERROR) { + printf("win32recv: setsockopt failed. errno = %d\n", WSAGetLastError()); + return -1; + } + + do { + rv = WSASend(iol->fd, pWsaData, num, &len, 0, NULL, NULL); + if (rv != SOCKET_ERROR) { + free(pWsaData); + return len; + } + else { + lasterror = WSAGetLastError(); + } + } while (rv == SOCKET_ERROR && lasterror == WSAEINTR); + + /* TEST CODE + * If lasterror ==WSATIMEDOUT, then the connection timed out + */ + if (rv == SOCKET_ERROR && lasterror == WSAETIMEDOUT) { + printf("wsarecv: Connection timed out\n"); + } else { + printf("Connection failed. lasterror = %d\n", lasterror); + } + free(pWsaData); + return -1; } static const ap_iol_methods socket_methods = { win32_close,