ftp.nice.ch/pub/next/tools/performance/NWBench.NIHS.bs.tar.gz#/NWBench.NIHS.bs/Source/EthernetSpeed.m

This is EthernetSpeed.m in view mode; [Download] [Up]

#import "EthernetSpeed.h"

#import <appkit/appkit.h>

#import <sys/types.h>
#import <sys/socket.h>
#import <sys/ioctl.h>
#import <sys/time.h>

#import <netinet/in.h>

#define	TELOPTS
#import <arpa/telnet.h>
#import <arpa/inet.h>

#import <stdio.h>
#import <ctype.h>
#import <errno.h>
#import <signal.h>
#import <setjmp.h>
#import <netdb.h>
#import <strings.h>
#import <libc.h>

@implementation EthernetSpeed

#define XFER 1024

- benchmark
{
	struct  hostent *host = 0;
	struct  sockaddr_in sin;
	struct	servent *sp;
	int	tcpfd=0;
	int	connected=0;
	char	buf[8192];
	int	i;
	char 	*hostname = (char *)[hostCell stringValue];


	sp	= getservbyname("discard", "tcp");
	host 	= gethostbyname(hostname);
	if (host) {
		sin.sin_family = host->h_addrtype;
		memcpy(&sin.sin_addr,
		       host->h_addr_list[0],
		       host->h_length);
	}
	else{
		sin.sin_addr.s_addr = inet_addr((char *)hostname);
		if (sin.sin_addr.s_addr == -1) {
			printf("%s: unknown host\n", hostname);
			return self;
		}
		sin.sin_family = AF_INET;
	}

	sin.sin_port = sp->s_port;

	/* try all addresses for connections */
	while(connected==0){
		tcpfd = socket(AF_INET, SOCK_STREAM, 0);
		if (tcpfd < 0) {
			perror("telnet: socket");
			return 0;
		}
		if (connect(tcpfd, (struct sockaddr *)&sin, sizeof (sin)) < 0){
			if (host && host->h_addr_list[1]) {

				printf("connect to address %s: %s",
				       inet_ntoa(sin.sin_addr),
				       strerror(errno));

				host->h_addr_list++;
				memcpy(&sin.sin_addr,
				       host->h_addr_list[0],
				       host->h_length);

				printf("Trying %s...\n",
				       inet_ntoa(sin.sin_addr));
				close(tcpfd);
				continue;
			}
			perror("connect");
			return 0;
		}
		connected = 1;
	}

	/* at this point, anything written to tcpfd will get sent, and
	 * anything read from tcpfd will be from the network...
	 */
	
	for(i=0;i<XFER;i++){
		write(tcpfd,buf,sizeof(buf));
	}
	close(tcpfd);
	return self;
}

-shutdownBenchmark
{
	double mpersec	= XFER * 8192 / (1024*1024 * wallTime);
	char	buf[256];

	[ethCell setDoubleValue:mpersec];
	sprintf(buf,"Ethernet speed: %g",mpersec);
	[self	logResults:buf];

	return self;
}


@end

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.