免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345下一页
最近访问板块 发新帖
查看: 10720 | 回复: 47
打印 上一主题 下一主题

询问telnet协议编写程序 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-07-26 09:38 |只看该作者 |倒序浏览
近期需要写一个程序,用telnet协议登陆到远程主机,遇到很大问题,请了解这方面的认识不吝赐教!!

论坛徽章:
0
2 [报告]
发表于 2006-07-26 09:47 |只看该作者
你到底遇到了什么问题嘛,贴出来大家才好分析啊

论坛徽章:
0
3 [报告]
发表于 2006-07-26 11:25 |只看该作者

这个是源码

int create_telnet_cli(const char *host, const char *service)
{
        unsigned char rbuf[LINELEN]; // buffer for one line of text
        unsigned char wbuf[LINELEN]; // buffer for one line of text
        unsigned char msg[LINELEN];
        unsigned char ch;
        unsigned char lcOption;
        int li_sock, li_count; // li_socket descriptor, read count
        int outchars, inchars; // characters sent and received
        int i;
       
        printf("entering into telnet_cli\n");
        li_sock = connectTCP(host,service);
        printf("li_socket is: %d\n", li_sock);
        bzero(wbuf, LINELEN);
        bzero(rbuf, LINELEN);
       
       
        sprintf(wbuf, "%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n", IAC, DODO, 3, IAC, WILL, 24,IAC, WILL, 31,\
        IAC, WILL, 32, IAC, WILL, 33, IAC, WILL, 34, IAC, WILL, 39, IAC, DODO, 5);
        write(li_sock, wbuf, strlen(wbuf));
       
        //sprintf(wbuf, "%c%c%c\n", IAC, WONT, 37);
        //write(li_sock, wbuf, strlen(wbuf));
       
        while ((li_count = recv(li_sock, rbuf, LINELEN, 0))>=0 )
        {
                printf("length: %d, %s\n", li_count, rbuf);
                //sleep(5);
                if (li_count == 0)
                {
                printf("socket has been closed!\n");
                exit(1);
                }
                //if li_count > 0, it means that the socket has received some characters from the server
                for (i = 0; i <= li_count - 1; )
                {
                        printf("rbuf[%d] is : %d\n", i, rbuf[i]);
                        //sleep(2);
                        //ch = rbuf[i];
                        //printf("%c\n",ch);
                        if ( rbuf[i] == IAC)
                        {
                        //printf("rbuf[%d] is IAC\n", i);
                        //gsSendMsg[i]= rbuf[i];
                       
                        ch = rbuf[i + 1];
                        printf("%d\n", ch);
                        //i++;
                        lcOption = rbuf[i + 2];
                        printf("fdsafafsafasfsafsa%d\n", lcOption);
                        i = i + 3;
                        switch (ch)
                        {
                        case DODO:
                                if (lcOption == AUTH)
                                {
                                printf("RECV DO AUTHENTICATION (37)\n");
                                //sleep(5);
                                bzero(gsSendMsg, LINELEN);
                                sprintf(gsSendMsg, "%c%c%c\n", IAC, WONT, AUTH);
                                write(li_sock, gsSendMsg, strlen(gsSendMsg));
                                }
                               
                                if (lcOption == NAWS)
                                {
                                printf("RECV DO NAWS (31)\n");
                                //sleep(5);
                                bzero(gsSendMsg, LINELEN);
                                //////SEND IAC SB NAWS 0 132 (132) 0 52 (52)
                                //the key point is to find SB syntax.
                                sprintf(gsSendMsg, "%c%c%c%d%d%d%d%c%c\n", IAC, SB, NAWS, 0,80,0,24,IAC,SE);
                                write(li_sock, gsSendMsg, strlen(gsSendMsg));
                                }
                               
                                if (lcOption == XDISPLOC)
                                {
                                printf("RECV DO XDISPLOC (35)\n");
                                //sleep(5);
                                bzero(gsSendMsg, LINELEN);
                                sprintf(gsSendMsg, "%c%c%c\n", IAC, WONT, XDISPLOC);
                                write(li_sock, gsSendMsg, strlen(gsSendMsg));
                                }
                               
                                if (lcOption == OLD_ENVIRON)
                                {
                                printf("RECV DO OLD-ENVIRON (36)\n");
                                //sleep(5);
                                bzero(gsSendMsg, LINELEN);
                                sprintf(gsSendMsg, "%c%c%c\n", IAC, WONT, OLD_ENVIRON);
                                write(li_sock, gsSendMsg, strlen(gsSendMsg));
                                }
                                if (lcOption == ECHO_ON)
                                {
                                printf("RECV DO ECHO (1)\n");
                                sleep(5);
                                bzero(gsSendMsg, LINELEN);
                                sprintf(gsSendMsg, "%c%c%c\n", IAC, WONT, ECHO_ON);
                                write(li_sock, gsSendMsg, strlen(gsSendMsg));
                                }
                                break;
                               
                        case DONT:
                                printf("ch is DONT\n");
                                break;
                        case WILL:
                                if (lcOption == ECHO_ON)
                                {
                                printf("RECV WILL ECHO (1)\n");
                                sleep(5);
                                bzero(gsSendMsg, LINELEN);
                                sprintf(gsSendMsg, "%c%c%c\n", IAC, DODO, ECHO_ON);
                                write(li_sock, gsSendMsg, strlen(gsSendMsg));
                                }
                                break;
                        case WONT:
                                break;
                        case SB:
                                printf("ch is SB\n");
                                sleep(5);
                                if (lcOption == TSPEED)
                                {
                                        printf("RECV IAC SB TERMINAL SPEED SEND (32)\n");
                                        printf("%d%d%d\n", rbuf[i], rbuf[i + 1], rbuf[i + 2]);
                                        //i = i + 3;
                                        sleep(5);
                                        bzero(gsSendMsg, LINELEN);
                                        sprintf(gsSendMsg, "%c%c%c%c%d%d%d%d%c%c\n", IAC, SB, TSPEED, IS, 38400 >> 8, (38400 & 0xFF), 38400 >> 8, (38400 & 0xFF), IAC,SE);
                                        write(li_sock, gsSendMsg, strlen(gsSendMsg));
                                }
                                if (lcOption == NEW_ENVIRON)
                                {
                                        printf("RECV IAC SB NEW-ENVIRON SEND (39)\n");
                                        printf("%d%d%d\n", rbuf[i], rbuf[i + 1], rbuf[i + 2]);
                                        //i = i + 3;
                                        sleep(5);
                                        bzero(gsSendMsg, LINELEN);
                                        sprintf(gsSendMsg, "%c%c%c%c%c%c\n", IAC, SB, NEW_ENVIRON, IS, IAC, SE);
                                        write(li_sock, gsSendMsg, strlen(gsSendMsg));
                                }
                               
                                if (lcOption == TERMINAL)
                                {
                                        printf("RECV IAC SB TERMINAL TYPE SEND (24)\n");
                                        printf("%d%d%d\n", rbuf[i], rbuf[i + 1], rbuf[i + 2]);
                                        //i = i + 3;
                                        sleep(5);
                                        bzero(gsSendMsg, LINELEN);
                                        sprintf(gsSendMsg, "%c%c%c%c%s%c%c\n", IAC, SB, NEW_ENVIRON, IS,"ANSI", IAC, SE);
                                        write(li_sock, gsSendMsg, strlen(gsSendMsg));
                                        printf("okokok\n");
                                        bzero(gsSendMsg, LINELEN);
                                        sprintf(gsSendMsg, "%c%c%c\n", IAC, DODO,ECHO_ON);
                                        write(li_sock, gsSendMsg, strlen(gsSendMsg));
                                        printf("okokok\n");
                                }
                                i = i + 3;
                                break;
                               
                        default:
                                printf("ch is other character\n");
                                break;
                        }
                       
                        }
                        else
                        {
                        //printf("ch isn't IAC, there are maybe some errors occur!\n");
                        i++;
                        }
                }
        }
}

论坛徽章:
0
4 [报告]
发表于 2006-07-26 11:25 |只看该作者

问题!

问题是我没有发现传递用户名和密码的地方!!
比较奇怪

论坛徽章:
0
5 [报告]
发表于 2006-07-26 11:32 |只看该作者

问题继续

如果我想传递一个命令,如下载一个文件"get filename"到本地,我应该怎么做呢?

论坛徽章:
0
6 [报告]
发表于 2006-07-26 11:39 |只看该作者
如果是client端的话,密码和用户名是肯定要传的,你再找下。
telnet有下载功能吗?

论坛徽章:
0
7 [报告]
发表于 2006-07-26 11:40 |只看该作者

问题是我没找到啊!

问题是我没找到啊!

哪位大侠能帮忙解决一下啊◎!◎

论坛徽章:
0
8 [报告]
发表于 2006-07-26 11:54 |只看该作者
这个程序是哪里来的啊?
那些宏是什么意思啊

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2006-07-26 11:57 |只看该作者
telnet 协议不包括对没有用户名和密码的认证,那是 telnet 应用需要做的。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
10 [报告]
发表于 2006-07-26 11:58 |只看该作者
像你这种情况,建议还是用 Except 来做,就不用这么痛苦了。
写个不超过 30 行的 Except 脚本,绝对你解决你的问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP