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

📄 216.htm

📁 unix高级编程原吗
💻 HTM
📖 第 1 页 / 共 2 页
字号:
                     "]",              "   ",          /* 文章题目 <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 + -