📄 217.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 + -