Selaa lähdekoodia

increased transmit and receive buffer size for UDP sockets to improve the throughput

git-svn-id: https://svn.inf.ethz.ch/svn/lecturers/a2/trunk@6459 8c9fc860-2736-0410-a75d-ab315db34111
eth.morozova 9 vuotta sitten
vanhempi
commit
4644e5f295
2 muutettua tiedostoa jossa 22 lisäystä ja 1 poistoa
  1. 18 1
      source/Win32.UDP.Mod
  2. 4 0
      source/Win32.WSock32.Mod

+ 18 - 1
source/Win32.UDP.Mod

@@ -8,6 +8,9 @@ CONST
 	unknown = 1;  IPAdrLen = 4;
 	NilPort* = 0;  (* Dan 31.01.05 *)
 
+	SendBufSize = 65536*8; (* send buffer size in bytes *)
+	RecvBufSize = 65536*16; (* receive buffer size in bytes *)
+
 TYPE
 
 TYPE
@@ -18,7 +21,10 @@ TYPE
 	Opens a socket which is dedicated to datagram services. lport is registered to receive datagrams
 	from any port and any host. *)
 		PROCEDURE & Open*( lport: LONGINT;  VAR res: LONGINT );
-		VAR sadr: WSock32.sockaddrIn;  err: LONGINT;
+		VAR
+			sadr: WSock32.sockaddrIn;
+			err: LONGINT;
+			bufSize, len: LONGINT;
 		BEGIN
 			(* IF ~AosWinsock.ready THEN RETURN END;  *)
 			sock := WSock32.socket( WSock32.PFINet, WSock32.SockDGram, WSock32.IPProtoUDP );
@@ -32,6 +38,17 @@ TYPE
 				END
 			ELSE res := unknown;
 			END;
+			
+			bufSize := SendBufSize; len := SIZEOF(LONGINT);
+			err := WSock32.setsockopt(sock,WSock32.SOLSocket,WSock32.SOSndBuf,bufSize,len);
+			IF (err # 0) & trace THEN
+				KernelLog.String( "UDP.Open : failed to set send buffer size, WSock32 error code " ); KernelLog.Int(err,0); KernelLog.Ln;
+			END;
+			bufSize := RecvBufSize;
+			err := WSock32.setsockopt(sock,WSock32.SOLSocket,WSock32.SORcvBuf,bufSize,SIZEOF(LONGINT));
+			IF (err # 0) & trace THEN
+				KernelLog.String( "UDP.Open : failed to set receive buffer size, WSock32 error code " ); KernelLog.Int(err,0); KernelLog.Ln;
+			END;
 
 			IF trace THEN
 				KernelLog.String( "UDP.Open : " );  KernelLog.Int( lport, 1 );  KernelLog.String( "(" );  KernelLog.Int( res, 1 );

+ 4 - 0
source/Win32.WSock32.Mod

@@ -33,6 +33,8 @@ MODULE WSock32; (* AUTHOR "ejz, additions Alex Popescu"; PURPOSE " Win32 WSock32
 		
 		SOLSocket* = 0FFFFH; 
 		SOMaxConn* = 07FFFFFFFH;
+		SOSndBuf* = 01001H; (** send buffer size *)
+		SORcvBuf* = 01002H; (** receive buffer size *)
 		SOSndTimeo* = 01005H; SORcvTimeo* = 01006H;
 		SIORcvAll* = LONGINT(98000001H);
 		
@@ -207,6 +209,7 @@ MODULE WSock32; (* AUTHOR "ejz, additions Alex Popescu"; PURPOSE " Win32 WSock32
 
 		(** The Windows Sockets setsockopt function sets a socket option. *)
 		setsockopt-: PROCEDURE {WINAPI} (s: Socket; level, optname: LONGINT; VAR optval: ARRAY   OF SYSTEM.BYTE; optlen: LONGINT): LONGINT;
+		getsockopt-: PROCEDURE {WINAPI} (s: Socket; level, optname: LONGINT; VAR optval: ARRAY   OF SYSTEM.BYTE; VAR optlen: LONGINT): LONGINT;
 
 		(** The Windows Sockets socket function creates a socket that is bound to a specific service provider. *)
 		socket-: PROCEDURE {WINAPI} (af, type, protocol: LONGINT): Socket;
@@ -264,6 +267,7 @@ MODULE WSock32; (* AUTHOR "ejz, additions Alex Popescu"; PURPOSE " Win32 WSock32
 		Kernel32.GetProcAddress(wsock32, "send", SYSTEM.VAL(ADDRESS, send));
 		Kernel32.GetProcAddress(wsock32, "sendto", SYSTEM.VAL(ADDRESS, sendto));
 		Kernel32.GetProcAddress(wsock32, "setsockopt", SYSTEM.VAL(ADDRESS, setsockopt));
+		Kernel32.GetProcAddress(wsock32, "getsockopt", SYSTEM.VAL(ADDRESS, getsockopt));
 		Kernel32.GetProcAddress(wsock32, "socket", SYSTEM.VAL(ADDRESS, socket));
 		Kernel32.GetProcAddress(wsock32, "shutdown", SYSTEM.VAL(ADDRESS, shutdown));