荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: jjk (UNIX+C+XML+?? 傻了?), 信区: Linux
标  题: about bbs post                         guru (转寄)[转载]
发信站: 荔园晨风BBS站 (Thu Apr 25 10:25:41 2002), 转信

【 以下文字转载自 jjk 的信箱 】
【 原文由 jjk.bbs@apue.dhs.org 所发表 】
发信人: xh (爱我--很累), 信区: Socket
标  题: 原码重读(2)--autopost
发信站: 华南网木棉站 (Sun Nov 14 22:47:03 1999), 转信
    整个程序结构比较简单,不想罗嗦了,这里只讲它的精华:waitstring的协商部分
,使用这段代码,就能完成最头痛的协商,然后就可以随心所欲的编写自己的telnet应

了。阅读时请参考精华区->Socket编程之绝学篇->telnet编程中的telnet基本过程.
    这里再罗嗦一下一些基本常识:
    1.IAC(255) telnet的控制命令混杂在字节流里面,以这个255表明这是个三元协商

队列,后跟verb和option
    2.verb 有四种类型 Do(253)Dont(254)Will(251)Wnot(252).
    Do/Dont-><-Will/Wnot  一方用Do向对方发出请求(Request),另一方用Will作答.
    如:Client发送IAC DONT ECHO要求Server不要回显字符,Server用IAC WNOT ECHO

    作答
    Will/Wnot-><-Do/Dont  一方用Will指定自己(Offer),另一方用Do作答
    3.option 有四种 0 二进制传输 1 Echo 3 抑制向前 24 终端类型
    4.子协商队列
      以255 250开头 255 240结束
void waitString( char *string) /*从server发来的字节流中匹配特定串,找到就返回
  */
  {
    char                    term[]="dumb";     /* 终端类型: 哑终端   */
    unsigned char           c,cmd,opt;
    for(;;)
    {      n=read(sockfd,& c,1);           /* 读取一个字节           */
           if( n<=0 )
           { printf("socket read error.\n"); exit(-1); }
           if (c == 255)
           /*如果是IAC(255)字符,表明是server发过来的协商队列,将开始与server协

?           */
?           {
                cmd = receiveChar();         //读入命令 DO/DONT/WILL/WONT
                opt = receiveChar();         //读入选项 0 /1 /3 /24
                switch(opt) {
                        case 1:              // echo协商选项,本程序未处理
                        break;
                        case 3:              // supress go-ahead(抑制向前选项
)
                        break;
                        case 24:             // terminal type(终端类型选项)
                        if (cmd == 253) {
                   /*服务器发来DO(253),要求client回答
                     Client用IAC WILL TERMTYPE 答应告诉server自己终端类型
                    */
                                sendChar((char)255);
                                sendChar((char)251);
                                sendChar((char)24);
                  /*开始用子协商序列回答自己的终端类型
                   *IAC SB terminal-type IS <term> IAC SE
                   */
                                sendChar((char)255);
                                sendChar((char)250);
                                sendChar((char)24);
                                sendChar((char)0);
                                sendString(term);
                                sendChar((char)255);
                                sendChar((char)240);
                 /*SB和SE要配对出现 协商序列完毕*/
                                }
                        else if (cmd == 250) {   //server发来自己的终端类型
                                while(receiveChar() != 240)
                                        ;        /*不作处理,直到server发完为

                                                   SubnegotiationEnd(240)*/
                                }
                        break;
                        default:        // some other command1
                        if (cmd == 253) {
                                // IAC DONT whatever
                                sendChar((char)255); //其它的协商选项均不同意

                                sendChar((char)252);
                                sendChar((char)opt);
                                }
                 }
            }
     }
}
--
                                                   V2 Studio Xh2000
※ 修改:.xh 于 Nov 14 22:58:53 修改本文.[FROM: 202.38.248.62]
--
※ 转寄:·UNIX编程 apue.dhs.org·[FROM: 210.39.3.50]
--
※ 转载:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.0.146]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店