📄 216.htm
字号:
"]", " ", /* 文章题目 <br>
*/ <br>
*/ <br>
"T", "\r\n" /*确定 <br>
*/ <br>
}; <br>
/* 下面的字符是文章输入完之后的情况 */ <br>
/* 左边的一列是需要自己从键盘输入的,右边的一列是server传过来的 */ <br>
char command2[ M ][20]={ <br>
"^W", "]:", /*文章输完后按Ctrl-W存盘 <br>
*/ <br>
"s\r\n", "[h]", /*按s转信 <br>
*/ <br>
"!\r\n" /*旋风离站 <br>
*/ <br>
}; <br>
int sockfd=-1; /*管套描述符 * <br>
/ <br>
void waitString(char *string); /*等待一个特定字符串 <br>
* <br>
unsigned char receiveChar(void) //从socket读取server发来的一个字节 <br>
{ char tmp; <br>
if(read(sockfd,& tmp,1)<=0 ) { printf("read socket error.\n"); exit(-1);} <br>
return tmp; <br>
} <br>
} <br>
void sendChar(char ch) //从socket向server发送一个字节 <br>
{ <br>
if( write(sockfd,& ch,1)<0 ) { printf("write socket error.\n"); exit(-1); <br>
} <br>
} <br>
void sendString(char p[]) //从socket向server发送一个字符串 <br>
{ <br>
if(write(sockfd,p,strlen(p))<0) { printf("write socket error.\n"); exit(-1); <br>
}; <br>
} <br>
void killHandle(void) //信号处理函数 <br>
{ <br>
close(sockfd); <br>
exit(0); <br>
} <br>
/*========================================================================== <br>
=*/ <br>
main(int argc,char **argv) <br>
{ <br>
struct sockaddr_in host; <br>
struct hostent *hp; <br>
int commandCounter; <br>
int status; <br>
int f,k; <br>
char fileBuf[SIZE]; <br>
if( argc<4) { printf("Usage: %s fileName boardName title\n",argv[0 <br>
]); <br>
exit(0); <br>
} <br>
f=open(argv[1],O_RDONLY); /*打开本地磁盘文件 <br>
*/ <br>
if( f< 0) { printf("open file error\n"); exit(-1); } <br>
for(k=0; k< NUM_OF_BOARD; k++) <br>
{ <br>
if( strcmp(argv[2],boardName[k])==0) <br>
{ sprintf(& (command1[BOARD][0]),"%d\r\n\r\n",k+1); <br>
break; <br>
} <br>
} <br>
if(k>=NUM_OF_BOARD) { printf("Bad boardName: %s\n",argv[2]); <br>
exit(0); <br>
} <br>
strcpy(& (command1[TITLE][0]),argv[3]); <br>
strcat(& (command1[TITLE][0]),"\r\n"); <br>
signal(SIGTERM,killHandle); /* 设回调函数 <br>
*/ <br>
signal(SIGINT,killHandle); <br>
hp = gethostbyname("bbs.gznet.edu.cn"); /* bbs服务器的名字 <br>
*/ <br>
if(hp==NULL) { printf("Unkonwn host\n"); exit(-1); } <br>
bzero((char *)& host,sizeof(host)); <br>
bcopy(hp->h_addr,(char *)& host.sin_addr,hp->h_length); <br>
host.sin_family=AF_INET; <br>
host.sin_port=htons(23); /*telnet标准端口 * <br>
/ <br>
if ( (sockfd=socket(AF_INET,SOCK_STREAM,0))<0 ) /* 阻塞式socket */ <br>
{ printf(" Error open socket\n"); <br>
exit(-1); <br>
} <br>
status=connect(sockfd,(struct sockaddr *)& host,sizeof(host));/*连接 <br>
*/ <br>
if(status<0) { printf("Connect error\n"); exit(-1); } <br>
for(commandCounter=0; commandCounter< N; ) /*登录进bbs站 */ <br>
{ waitString( command1[commandCounter ++] ); <br>
sendString( command1[commandCounter ++] ); <br>
} <br>
} <br>
while( (status=read(f,fileBuf,SIZE) )>0 ) /*把文件内容发往bbs * <br>
/ <br>
{ for(k=0; k< status; k++) <br>
{ write(sockfd,&(fileBuf[k]),1); <br>
if( fileBuf[k]==0x0A ) write(sockfd,"\0x0D",1); <br>
} <br>
} <br>
sleep(1); <br>
close(f); <br>
for(commandCounter=0; commandCounter< M -1; ) /* 存盘离站 */ <br>
{ sendString( command2[ commandCounter ++] ); <br>
waitString( command2[ commandCounter ++ ]); <br>
} <br>
sendString(command2[M-1] ); <br>
sleep(1); <br>
close(sockfd); <br>
printf("\npost ok.\n"); <br>
} <br>
/*========================================================================== <br>
=*/ <br>
void waitString( char *string) /*从server发来的字节流中匹配特定串,找到就返回 <br>
*/ <br>
*/ <br>
{ <br>
int m,n; <br>
int len; <br>
char equal; <br>
char term[]="dumb"; /* 终端类型: 哑终端 */ <br>
int status; <br>
struct timeval timeout; <br>
struct fd_set mask; <br>
unsigned char c,cmd,opt; <br>
len=strlen(string); /* 欲匹配的串的长度 */ <br>
m=0; /* 串中的当前匹配位置 */ <br>
equal=FALSE; /* 布尔变量 */ <br>
for(;;) <br>
{ n=read(sockfd,& c,1); /* 读取一个字节 */ <br>
if( n<=0 ) { printf("socket read error.\n"); exit(-1); } <br>
if (c == 255) // IAC字符,后跟telnet命令和协商选项 <br>
<br>
{ <br>
cmd = receiveChar(); //读入命令 <br>
opt = receiveChar(); //读入选项 <br>
switch(opt) { <br>
case 1: // echo协商选项,本程序未处理 <br>
break; <br>
case 3: // supress go-ahead(抑制向前选项) <br>
break; <br>
case 24: // terminal type(终端类型选项) <br>
if (cmd == 253) { <br>
// IAC WILL terminal-type 将告诉server终端类 <br>
型 <br>
sendChar((char)255); <br>
sendChar((char)251); <br>
sendChar((char)24); <br>
// IAC SB terminal-type IS <term> IAC SE <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>
} <br>
else if (cmd == 250) { //SB和SE要配对出现 <br>
while(receiveChar() != 240) <br>
; <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>
else //处理字符数据 <br>
{ putchar(c); <br>
if( *(string+m)==c ) { m++; equal=TRUE; } //相等则匹配下一字符 <br>
<br>
else { m=0; equal=FALSE; }//不等则从头再来 <br>
if(equal==TRUE && m>=len) return; //找到期待的字符串就返 <br>
回 <br>
} <br>
} <br>
} <br>
-- <br>
※ 来源:.华南网木棉站 bbs.gznet.edu.cn.[FROM: 202.38.198.197] <br>
-- <br>
</small><hr>
<p align="center">[<a href="index.htm">回到开始</a>][<a href="186.htm">上一层</a>][<a href="217.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 + -