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

📄 217.htm

📁 unix高级编程原吗
💻 HTM
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>CTerm非常精华下载</title>
</head>
<body bgcolor="#FFFFFF">
<table border="0" width="100%" cellspacing="0" cellpadding="0" height="577">
<tr><td width="32%" rowspan="3" height="123"><img src="DDl_back.jpg" width="300" height="129" alt="DDl_back.jpg"></td><td width="30%" background="DDl_back2.jpg" height="35"><p align="center"><a href="http://apue.dhs.org"><font face="黑体"><big><big>apue</big></big></font></a></td></tr>
<tr>
<td width="68%" background="DDl_back2.jpg" height="44"><big><big><font face="黑体"><p align="center">               ● UNIX网络编程                       (BM: clown)                </font></big></big></td></tr>
<tr>
<td width="68%" height="44" bgcolor="#000000"><font face="黑体"><big><big><p   align="center"></big></big><a href="http://cterm.163.net"><img src="banner.gif" width="400" height="60" alt="banner.gif"border="0"></a></font></td>
</tr>
<tr><td width="100%" colspan="2" height="100" align="center" valign="top"><br><p align="center">[<a href="index.htm">回到开始</a>][<a href="186.htm">上一层</a>][<a href="218.htm">下一篇</a>]
<hr><p align="left"><small>发信人: xh (爱我--很累), 信区: Socket <br>

标  题: 原码重读(2)--autopost <br>

发信站: 华南网木棉站 (Sun Nov 14 22:47:03 1999), 转信 <br>

    整个程序结构比较简单,不想罗嗦了,这里只讲它的精华:waitstring的协商部分 <br>

,使用这段代码,就能完成最头痛的协商,然后就可以随心所欲的编写自己的telnet应 <br>

用 <br>

了。阅读时请参考精华区->Socket编程之绝学篇->telnet编程中的telnet基本过程. <br>

    这里再罗嗦一下一些基本常识: <br>

    1.IAC(255) telnet的控制命令混杂在字节流里面,以这个255表明这是个三元协商 <br>

  <br>

队列,后跟verb和option <br>

    2.verb 有四种类型 Do(253)Dont(254)Will(251)Wnot(252). <br>

    Do/Dont-><-Will/Wnot  一方用Do向对方发出请求(Request),另一方用Will作答. <br>

    如:Client发送IAC DONT ECHO要求Server不要回显字符,Server用IAC WNOT ECHO <br>

  <br>

    作答 <br>

    Will/Wnot-><-Do/Dont  一方用Will指定自己(Offer),另一方用Do作答 <br>

    3.option 有四种 0 二进制传输 1 Echo 3 抑制向前 24 终端类型 <br>

    4.子协商队列 <br>

      以255 250开头 255 240结束 <br>

void waitString( char *string) /*从server发来的字节流中匹配特定串,找到就返回 <br>

  */ <br>

  { <br>

  { <br>

    char                    term[]="dumb";     /* 终端类型: 哑终端   */ <br>

    unsigned char           c,cmd,opt; <br>

    for(;;) <br>

    {      n=read(sockfd,& c,1);           /* 读取一个字节           */ <br>

           if( n<=0 ) <br>

           { printf("socket read error.\n"); exit(-1); } <br>

           if (c == 255) <br>

           /*如果是IAC(255)字符,表明是server发过来的协商队列,将开始与server协 <br>

  <br>

            */ <br>

            { <br>

                cmd = receiveChar();         //读入命令 DO/DONT/WILL/WONT <br>

                opt = receiveChar();         //读入选项 0 /1 /3 /24 <br>

                switch(opt) { <br>

                        case 1:              // echo协商选项,本程序未处理 <br>

                        break; <br>

                        case 3:              // supress go-ahead(抑制向前选项 <br>

) <br>

                        break; <br>

                        case 24:             // terminal type(终端类型选项) <br>

                        if (cmd == 253) { <br>

                   /*服务器发来DO(253),要求client回答 <br>



                     Client用IAC WILL TERMTYPE 答应告诉server自己终端类型 <br>

                    */ <br>

                                sendChar((char)255); <br>

                                sendChar((char)251); <br>

                                sendChar((char)24); <br>

                  /*开始用子协商序列回答自己的终端类型 <br>

                   *IAC SB terminal-type IS <term> IAC SE <br>

                   */ <br>

                                sendChar((char)255); <br>

                                sendChar((char)250); <br>

                                sendChar((char)24); <br>

                                sendChar((char)0); <br>

                                sendString(term); <br>

                                sendChar((char)255); <br>

                                sendChar((char)240); <br>

                 /*SB和SE要配对出现 协商序列完毕*/ <br>

                                } <br>

                        else if (cmd == 250) {   //server发来自己的终端类型 <br>

                                while(receiveChar() != 240) <br>

                                        ;        /*不作处理,直到server发完为 <br>

止 <br>

                                                   SubnegotiationEnd(240)*/ <br>



                                } <br>

                        break; <br>

                        default:        // some other command1 <br>

                        if (cmd == 253) { <br>

                                // IAC DONT whatever <br>

                                sendChar((char)255); //其它的协商选项均不同意 <br>

  <br>

                                sendChar((char)252); <br>

                                sendChar((char)opt); <br>

                                } <br>

                 } <br>

            } <br>

     } <br>

} <br>

-- <br>

                                                   V2 Studio Xh2000 <br>

※ 修改:.xh 于 Nov 14 22:58:53 修改本文.[FROM: 202.38.248.62] <br>

</small><hr>
<p align="center">[<a href="index.htm">回到开始</a>][<a href="186.htm">上一层</a>][<a href="218.htm">下一篇</a>]
<p align="center"><a href="http://cterm.163.net">欢迎访问Cterm主页</a></p>
</table>
</body>
</html>

⌨️ 快捷键说明

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