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

📄 telnet.c,v

📁 tcp/ip原理的第三卷
💻 C,V
字号:
head	1.2;
access;
symbols;
locks
	dls:1.2; strict;
comment	@ * @;


1.2
date	93.04.27.22.06.23;	author dls;	state Fix;
branches;
next	1.1;

1.1
date	93.04.14.02.36.06;	author dls;	state Old;
branches;
next	;


desc
@@


1.2
log
@*** empty log message ***
@
text
@/* 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) shutdown(d, 1);
			} else
				tewrite(rfp, stdout, buf, cc);
		}
		(void) fflush(stdout);
		(void) fflush(rfp);
	}
}
@


1.1
log
@Initial revision
@
text
@a3 1
#include <sys/types.h>
d9 1
d20 1
a20 1
#define	BUFSIZE		2048	/* read buffer size	*/
d22 2
d38 1
a41 1
	fd_set	arfds, awfds, rfds, wfds;
d58 4
a61 4
	FD_ZERO(&arfds);
	FD_ZERO(&awfds);
	FD_SET(d, &arfds);	/* the TLI descriptor		*/
	FD_SET(0, &arfds);	/* standard input		*/
d64 1
a64 5
		bcopy((char *)&arfds, (char *)&rfds, sizeof(rfds));
		bcopy((char *)&awfds, (char *)&wfds, sizeof(rfds));

		if (select(nfds, &rfds, &wfds, (fd_set *)0,
				(struct timeval *)0) < 0) {
d67 1
a67 1
			cerrexit("select: %s\n", sys_errlist[errno]);
d69 1
a69 1
		if (FD_ISSET(d, &rfds)) {
d83 1
a83 1
		if (FD_ISSET(0, &rfds)) {
d89 1
a89 1
				FD_CLR(0, &arfds);
@

⌨️ 快捷键说明

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