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

📄 telnet.c

📁 tcp/ip原理的第三卷
💻 C
字号:
/* telnet.c - telnet */

#include <sys/param.h>
#include <sys/time.h>
#include <sys/signal.h>
#include <sys/resource.h>
#include <sys/errno.h>

#include <poll.h>
#include <termios.h>
#include <stdio.h>

#include "local.h"

int	rcvurg();

extern int	errno;
extern char	*sys_errlist[];

#define	NFDS		   2	/* number of fd's (for poll)	*/

#define	BUFSIZE		2048	/* read buffer size		*/

struct termios	oldtty;

/*------------------------------------------------------------------------
 * telnet - do the TELNET protocol to the given host and port
 *------------------------------------------------------------------------
 */
int
telnet(host, service)
char	*host;
char	*service;
{
	int	d, nfds;	/* TLI descriptor & # file descriptors	*/
	FILE	*rfp;		/* buffered FILE pointer for remote	*/
	struct	rlimit	rlm;	/* to get max file descriptor number	*/
	struct	pollfd	fds[NFDS];
	u_char	buf[BUFSIZE];
	int	cc;
	int	on = 1;

	d = clientTCP(host, service);
	rwaddTLI(d);

	rfp = fdopen(d, "w");	/* for buffered remote output	*/

	ttysetup();

	fsmbuild();	/* set up FSM's */

	(void) signal(SIGURG, rcvurg);

	if (getrlimit(RLIMIT_NOFILE, &rlm) < 0)
		nfds = NOFILE;
	nfds = rlm.rlim_cur;

	fds[0].fd = 0;		/* standard input		*/
	fds[0].events = POLLIN;
	fds[1].fd = d;		/* the TLI descriptor		*/
	fds[1].events = POLLIN;

	while (1) {
		if (poll(fds, NFDS, -1) < 0) {
			if (errno == EINTR)
				continue;	/* just a signal	*/
			cerrexit("poll: %s\n", sys_errlist[errno]);
		}
		if (fds[1].revents & POLLIN) {	/* TLI desc	*/
			cc = read(d, (char *)buf, sizeof(buf));
			if (cc < 0)
				cerrexit("TLI read: %s\n",
						sys_errlist[errno]);
			else if (cc == 0) {
				printf("\nconnection closed.\n");
				if (tcsetattr(0, TCSADRAIN, &oldtty) < 0)
					errexit("tcsetattr: %s\n",
						sys_errlist[errno]);
				exit(0);
			} else
				ttwrite(rfp, stdout, buf, cc);
		}
		if (fds[0].revents & POLLIN) {	/* stdin desc	*/
			cc = read(0, (char *)buf, sizeof(buf));
			if (cc < 0)
				cerrexit("tty read: %s\n",
						sys_errlist[errno]);
			else if (cc == 0) {
				fds[0].fd = -1;
				(void) t_sndrel(d);
			} else
				tewrite(rfp, stdout, buf, cc);
		}
		(void) fflush(stdout);
		(void) fflush(rfp);
	}
}

⌨️ 快捷键说明

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