From: Vlad S. <ser...@us...> - 2007-12-18 18:21:38
|
Update of /cvsroot/naviserver/naviserver/nsd In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv31041/nsd Modified Files: driver.c queue.c Log Message: * nsd/driver.c: Fixed UDP drivers, async reads do not work with UDP packets, driver need to read packets as soon as possible and queue them instead of putting Sock into read/wait/close cycle like for TCP connections. Index: driver.c =================================================================== RCS file: /cvsroot/naviserver/naviserver/nsd/driver.c,v retrieving revision 1.96 retrieving revision 1.97 diff -C2 -d -r1.96 -r1.97 *** driver.c 21 Nov 2007 19:12:52 -0000 1.96 --- driver.c 18 Dec 2007 18:21:39 -0000 1.97 *************** *** 1275,1282 **** /* ! * Queue the socket immediately if request is provided */ ! if (sockPtr->drvPtr->opts & NS_DRIVER_QUEUE_ONACCEPT) { if (SockQueue(sockPtr, &now) == NS_TIMEOUT) { --- 1275,1283 ---- /* ! * Queue the socket immediately if request is provided. ! * This is true by default for UDP drivers */ ! if (sockPtr->drvPtr->opts & (NS_DRIVER_QUEUE_ONACCEPT|NS_DRIVER_UDP)) { if (SockQueue(sockPtr, &now) == NS_TIMEOUT) { *************** *** 1423,1427 **** * * Prepares for reading from the socket, allocates new request struct ! * for the given socket, copies remote ip address and port * * Results: --- 1424,1428 ---- * * Prepares for reading from the socket, allocates new request struct ! * for the given socket * * Results: *************** *** 1463,1468 **** reqPtr->leadblanks = 0; } - reqPtr->port = ntohs(sockPtr->sa.sin_port); - strcpy(reqPtr->peer, ns_inet_ntoa(sockPtr->sa.sin_addr)); sockPtr->reqPtr = reqPtr; } --- 1464,1467 ---- *************** *** 1517,1520 **** --- 1516,1526 ---- /* + * Make sure we update peer address with actual remote IP address + */ + + sockPtr->reqPtr->port = ntohs(sockPtr->sa.sin_port); + strcpy(sockPtr->reqPtr->peer, ns_inet_ntoa(sockPtr->sa.sin_addr)); + + /* * Actual queueing, if not ready spool to the waiting list */ *************** *** 1523,1526 **** --- 1529,1533 ---- return NS_TIMEOUT; } + return NS_OK; } *************** *** 1604,1608 **** { Sock *sockPtr; ! int slen; /* --- 1611,1615 ---- { Sock *sockPtr; ! int n; /* *************** *** 1624,1628 **** */ ! slen = sizeof(struct sockaddr_in); sockPtr->drvPtr = drvPtr; --- 1631,1635 ---- */ ! n = sizeof(struct sockaddr_in); sockPtr->drvPtr = drvPtr; *************** *** 1632,1647 **** sockPtr->arg = NULL; if (drvPtr->opts & NS_DRIVER_UDP) { sockPtr->sock = drvPtr->sock; ! } else { ! sockPtr->sock = Ns_SockAccept(drvPtr->sock, ! (struct sockaddr *) &sockPtr->sa, &slen); } - if (sockPtr->sock == INVALID_SOCKET) { ! /* ! * Accept failed - return the Sock to the free list. ! */ sockPtr->nextPtr = firstSockPtr; firstSockPtr = sockPtr; --- 1639,1668 ---- sockPtr->arg = NULL; + + /* + * In UDP mode we read packet right away and queue it immediately + * to allow driver continue processing other packets. Packet should + * contain the whole request. + */ + if (drvPtr->opts & NS_DRIVER_UDP) { sockPtr->sock = drvPtr->sock; ! ! if (SockRead(sockPtr, 0) != SOCK_READY) { ! SockRelease(sockPtr, 0, 0); ! return NULL; ! } ! ! drvPtr->queuesize++; ! return sockPtr; } ! /* ! * In TCP mode proceed with accepting socket the normal way, if accept failed ! * return the Sock to the free list. ! */ + sockPtr->sock = Ns_SockAccept(drvPtr->sock, (struct sockaddr *)&sockPtr->sa, &n); + if (sockPtr->sock == INVALID_SOCKET) { sockPtr->nextPtr = firstSockPtr; firstSockPtr = sockPtr; *************** *** 2099,2103 **** /* ! * Queue the socket after first network read */ --- 2120,2125 ---- /* ! * Queue the socket after first network read, do not parse incoming ! * data for HTTP-like headers */ Index: queue.c =================================================================== RCS file: /cvsroot/naviserver/naviserver/nsd/queue.c,v retrieving revision 1.21 retrieving revision 1.22 diff -C2 -d -r1.21 -r1.22 *** queue.c 6 Oct 2007 17:24:32 -0000 1.21 --- queue.c 18 Dec 2007 18:21:39 -0000 1.22 *************** *** 672,675 **** --- 672,676 ---- return; } + connPtr->contentLength = connPtr->reqPtr->length; connPtr->headers = connPtr->reqPtr->headers; |