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,
  
  
  

Reply via email to