發(fā)信人: hightman (鰻), 信區(qū): Socket
標 題: Re: 誰寫過簡單的telnet客戶端啊
發(fā)信站: 飄渺水云間 (Fri Aug 8 20:14:10 2003), 轉(zhuǎn)信
拷下來存成 .c 文件,
/*
hightman.bbs@bbs.hightman.net */
/* Unix: gcc -o d d.c */
/* Cygwin: gcc -o d d.c -DWIN32 */
/* 2002/12/16 */
#include <stdio.h>
#include <signal.h>
#ifdef WIN32
#include <sys/socket.h>
#endif
#include <netdb.h>
#include <termios.h>
unsigned char buf[2048];
int result, readnum;
int fd;
fd_set readfds;
struct termios t1;
struct timeval tv;
void break_check() {
int i;
tv.tv_sec = 0;
tv.tv_usec = 0;
FD_ZERO(&readfds) ;
FD_SET(0, &readfds);
result = select(1, &readfds, NULL, NULL, &tv);
if (FD_ISSET(0, &readfds)) {
readnum = read(0, buf, 80);
for (i=0; i<readnum; i++) {
if (buf[i] == 3 || buf[i] == 4 || buf[i] == 29) {
printf("\r\nX X X 用戶中斷操作!\r\n");
close(fd);
exit(0);
}
}
}
alarm(1);
}
int telnet(char *host, int port)
{
struct sockaddr_in blah;
struct hostent *he;
signal(SIGALRM, break_check);
alarm(1);
bzero((char*) &blah, sizeof(blah));
blah.sin_family = AF_INET;
blah.sin_port = htons(port);
printf("\r\n連線中.... \r\n");
fflush(stdout);
fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if ((he = gethostbyname(host)) != NULL)
bcopy(he->h_addr, (char*) &blah.sin_addr, he->h_length);
else
if ((blah.sin_addr.s_addr=inet_addr(host)) < 0) return -1;
if (connect(fd, (struct sockaddr*) &blah, 16) < 0) return -1;
/* 連上后就不允許定時器檢查中斷操作了 */
signal(SIGALRM, SIG_IGN);
printf("\033[H\033[J\033[m已連接到 %s.\r\n", host);
printf("返回請用 \033[1;32m‘Ctrl+]‘\033[m 鍵.\r\n");
fflush(stdout);
while(1) {
tv.tv_sec = 2400;
tv.tv_usec = 0;
FD_ZERO(&readfds) ;
FD_SET(fd, &readfds);
FD_SET(0, &readfds);
result = select(fd+1, &readfds, NULL, NULL, &tv);
if (result <= 0) break;
if (FD_ISSET(0, &readfds)) {
readnum = read(0, buf, 2048);
if (readnum <= 0) break;
if (buf[0] == 29) return 0;
/* 回車回顯問題
*if (buf[0] == 13 && readnum == 1) {
* buf[1] = 10;
* readnum++;
*}
*/
write(fd, buf, readnum);
} else {
readnum = read(fd, buf, 2048);
if (readnum <= 0) break;
if (strchr(buf, 255))
telnetopt(fd, buf, readnum);
else
write(0, buf, readnum);
}
}
}
int telnetopt(int fd, unsigned char *buf, int max) {
unsigned char c2, c3;
int i;
unsigned char tmp[30];
for (i = 0; i < max; i++) {
if (buf[i] != 255) {
write(0, &buf[i], 1);
continue;
}
c2 = buf[++i];
c3 = buf[++i];
if (c2 == 253 && (c3 == 3 || c3 == 24)) {
sprintf(tmp, "%c%c%c", 255, 251, c3);
write(fd, tmp, 3);
continue;
}
if ((c2 == 251 || c2 == 252) && (c3 == 1 || c3 == 3 || c3 == 24)) {
sprintf(tmp, "%c%c%c", 255, 253, c3);
write(fd, tmp, 3);
continue;
}
if (c2 == 251 || c2 == 252) {
sprintf(tmp, "%c%c%c", 255, 254, c3);
write(fd, tmp, 3);
continue;
}
if (c2 == 253 || c2 == 254) {
sprintf(tmp, "%c%c%c", 255, 252, c3);
write(fd, tmp, 3);
continue;
}
if (c2 == 250) {
while (c3 != 240 && i < max)
c3 = buf[++i];
sprintf(tmp, "%c%c%c%c%c%c%c%c%c%c", 255, 250, 24, 0, 65, 78, 83,
73, 255, 240);
write(fd, tmp, 10);
}
}
fflush(stdout);
}
int telnet_init() {
char buf[20], c;
c = 0;
if (tcgetattr(0, &t1)< 0) {
sprintf(buf, "%c%c%c%c%c%c", 255, 251, 3, 255, 251, 1);
write(0, buf, 6);
while (c != 1)
if (read(0, &c, 1) <= 0) exit(0);
} else {
cfmakeraw(&t1);
t1.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON);
t1.c_oflag &= ~OPOST;
t1.c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
t1.c_cflag &= ~(CSIZE|PARENB);
t1.c_cflag |= CS8;
tcsetattr(0, TCSANOW, &t1);
}
}
main(int argc, char *argv[])
{
int port = 23;
if (argc < 2)
{
printf("<Usage> %s <host> [port]\r\n", argv[0]);
return -1;
}
if (argc > 2)
port = atoi(argv[2]);
telnet_init();
telnet(argv[1], port);
return;
}
【 在 liuyidaojian (山水涅磐) 的大作中提到: 】
: 最好是用底層的socket寫的,
: 能否給我傳一個,10.111.154.107