[memcached] kronuz, r445: working in sendmsg() implementation

commits at code.sixapart.com commits at code.sixapart.com
Thu Nov 23 22:20:29 UTC 2006


working in sendmsg() implementation

U   branches/server-win32/Win32-Code/win32.h


Modified: branches/server-win32/Win32-Code/win32.h
===================================================================
--- branches/server-win32/Win32-Code/win32.h	2006-11-23 19:23:44 UTC (rev 444)
+++ branches/server-win32/Win32-Code/win32.h	2006-11-23 22:20:27 UTC (rev 445)
@@ -42,17 +42,15 @@
 #define F_SETFL 4
 
 #define IOV_MAX 1024
-struct iovec
-{
-    char *iov_base;
-    int   iov_len;
+struct iovec {
+	u_long iov_len;  
+	char FAR* iov_base;
 };
-
 struct msghdr
 {
 	void	*msg_name;			/* Socket name			*/
 	int		 msg_namelen;		/* Length of name		*/
-	struct iovec *msg_iov;			/* Data blocks			*/
+	struct iovec *msg_iov;		/* Data blocks			*/
 	int		 msg_iovlen;		/* Number of blocks		*/
 	void	*msg_accrights;		/* Per protocol magic (eg BSD file descriptor passing) */ 
 	int		 msg_accrightslen;	/* Length of rights list */
@@ -87,28 +85,63 @@
 #define MAXPACKETSIZE (1500-28)
 __inline int sendmsg(int s, const struct msghdr *msg, int flags)
 {
+/*
+	DWORD dwBufferCount;
+	int error = WSASendTo((SOCKET) s,
+		msg->msg_iov,
+		msg->msg_iovlen,
+		&dwBufferCount,
+		flags,
+		msg->msg_name,
+		msg->msg_namelen,
+		NULL,
+		NULL
+	);
+
+	if(error == SOCKET_ERROR) {
+		dwBufferCount = -1;
+		error = WSAGetLastError();
+		if(error == WSA_IO_PENDING) {
+			WSASetLastError(EAGAIN);
+		} else if(error == WSAECONNRESET) {
+			return 0;
+		}
+	}
+	return dwBufferCount;
+
+/*/
 	int ret;
-	u_char wrkbuf[MAXPACKETSIZE];
+	char *cp, *ep;
+	char wrkbuf[MAXPACKETSIZE];
+
 	int len = msg->msg_iovlen;
 	struct iovec *iov = msg->msg_iov;
-	u_char *cp, *ep;
-
-	for(cp = wrkbuf, ep = wrkbuf + MAXPACKETSIZE; --len >= 0; iov++) {
+	for(cp = wrkbuf, ep = wrkbuf + MAXPACKETSIZE; len-- > 0; iov++) {
+		char *pp = iov->iov_base;
 		int plen = iov->iov_len;
-		if (cp + plen >= ep) {
-			if(cp == wrkbuf) {
-				WSASetLastError(E2BIG);
-				return -1;
+		int clen = (ep - cp);
+		while(plen > clen) {
+			if(cp - wrkbuf) {
+				memcpy(cp, pp, clen);
+				ret = send(s, wrkbuf, MAXPACKETSIZE, flags);
+				pp += clen;
+				plen -= clen;
+				cp = wrkbuf;
+				clen = (ep - cp);
+			} else {
+				ret = send(s, pp, clen, flags);
+				pp += clen;
+				plen -= clen;
 			}
-			ret = send(s, (char*)wrkbuf, cp - wrkbuf, flags);
-			cp = wrkbuf;
+			if(ret == -1 && WSAGetLastError() != WSAECONNRESET) return -1;
 		}
-		memcpy(cp, iov->iov_base, plen);
+		memcpy(cp, pp, plen);
 		cp += plen;
 	}
-	ret = send(s, (char*)wrkbuf, cp - wrkbuf, flags);
+	ret = send(s, wrkbuf, (cp - wrkbuf), flags);
 	if(ret == -1 && WSAGetLastError() == WSAECONNRESET) return 0;
 	return ret;
+/**/
 }
 
 #endif




More information about the memcached-commits mailing list