⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tcptecho.cpp

📁 tcp udp 服务器客户端样本 来自commer的tcpip网络技术一书的例子
💻 CPP
字号:
/* TCPtecho.cpp - main, TCPtecho, reader, writer, mstime */#include <stdio.h>#include <string.h>#include <time.h>#include <winsock.h>#define	BUFSIZE		4096		/* write buffer size		*/#define	CCOUNT		64*1024		/* default character count	*/#define	WSVERS		MAKEWORD(2, 0)#define	MIN(x, y)	((x)>(y) ? (y) : (x))#define	USAGE	"usage: TCPtecho [ -c count ] host1 host2...\n"struct hdat {	char		*hd_name;	/* host name			*/	SOCKET		 hd_sock;	/* host socket descriptor	*/	unsigned	 hd_rc;		/* recv character count		*/	unsigned	 hd_wc;		/* send character count		*/} hdat[FD_SETSIZE];			/* fd to host name mapping	*/char	buf[BUFSIZE];			/* read/write data buffer	*/void	TCPtecho(fd_set *, int);int	reader(struct hdat *, fd_set *);void	writer(struct hdat *, fd_set *);void	errexit(const char *, ...);SOCKET	connectTCP(const char *, const char *);long	mstime(u_long *);/*------------------------------------------------------------------------ * main - concurrent TCP client for ECHO service timing *------------------------------------------------------------------------ */voidmain(int argc, char *argv[]){	int		ccount = CCOUNT;	int		i, hcount, fd;	unsigned long	one = 1;	fd_set		afds;	WSADATA		wsdata;	hcount = 0;	if (WSAStartup(WSVERS, &wsdata))		errexit("WSAStartup failed\n");	FD_ZERO(&afds);	for (i=1; i<argc; ++i) {		if (strcmp(argv[i], "-c") == 0) {			if (++i < argc && (ccount = atoi(argv[i])))				continue;			errexit(USAGE);		}		/* else, a host */		fd = connectTCP(argv[i], "echo");		if (ioctlsocket(fd, FIONBIO, &one)) {			fprintf(stderr,			    "can't mark nonblocking (host %s): %d\n",			    argv[i], GetLastError());			continue;		}		hdat[hcount].hd_name = argv[i];		hdat[hcount].hd_sock = fd;		hdat[hcount].hd_rc = hdat[hcount].hd_wc = ccount;		++hcount;		FD_SET(fd, &afds);	}	TCPtecho(&afds, hcount);	WSACleanup();	exit(0);}/*------------------------------------------------------------------------ * TCPtecho - time TCP ECHO requests to multiple servers *------------------------------------------------------------------------ */voidTCPtecho(fd_set *pafds, int hcount){	fd_set	rfds, wfds;		/* read/write fd sets		*/	fd_set	rcfds, wcfds;		/* read/write fd sets (copy)	*/	int	fd, hndx, i;	for (i=0; i<BUFSIZE; ++i)	/* echo data	*/		buf[i] = 'D';	memcpy(&rcfds, pafds, sizeof(rcfds));	memcpy(&wcfds, pafds, sizeof(wcfds));	(void) mstime((u_long *)0);	/* set the epoch */	while (hcount) {		memcpy(&rfds, &rcfds, sizeof(rfds));		memcpy(&wfds, &wcfds, sizeof(wfds));		if (select(FD_SETSIZE, &rfds, &wfds, (fd_set *)0,				(struct timeval *)0) == SOCKET_ERROR)			errexit("select failed: error %d\n",				GetLastError());		for (hndx=0; hndx<hcount; ++hndx) {			fd = hdat[hndx].hd_sock;			if (FD_ISSET(fd, &rfds))				if (reader(&hdat[hndx], &rcfds) == 0) {					/* this host is done */					for (i=hndx+1; i<hcount; ++i)						hdat[i-1]=hdat[i];					hcount--;					continue;				}			if (FD_ISSET(fd, &wfds))				writer(&hdat[hndx], &wcfds);		}	}}/*------------------------------------------------------------------------ * reader - handle ECHO reads *------------------------------------------------------------------------ */intreader(struct hdat *phd, fd_set *pfdset){	u_long	now;	int	cc;	cc = recv(phd->hd_sock, buf, sizeof(buf), 0);	if (cc == SOCKET_ERROR)		errexit("recv: error %d\n", GetLastError());	if (cc == 0)		errexit("recv: premature end of file\n");	phd->hd_rc -= cc;	if (phd->hd_rc > 0)		return 1;	(void) mstime(&now);	printf("%s: %d ms\n", phd->hd_name, now);	(void) closesocket(phd->hd_sock);	FD_CLR(phd->hd_sock, pfdset);	return 0;}/*------------------------------------------------------------------------ * writer - handle ECHO writes *------------------------------------------------------------------------ */voidwriter(struct hdat *phd, fd_set *pfdset){	int	cc;	cc = send(phd->hd_sock, buf, MIN(sizeof(buf), phd->hd_wc), 0);	if (cc == SOCKET_ERROR)		errexit("send: error number %d\n", GetLastError());	phd->hd_wc -= cc;	if (phd->hd_wc == 0) {		(void) shutdown(phd->hd_sock, 1);		FD_CLR(phd->hd_sock, pfdset);	}}/*------------------------------------------------------------------------ * mstime - report the number of clock ticks elapsed since mstime(0) call *------------------------------------------------------------------------ */longmstime(u_long *pms){	static unsigned long	epoch;	unsigned long		now;	now = clock();	if (pms == 0) {		epoch = now;		return 0;	}	*pms = now - epoch;	return *pms;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -