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

📄 224.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="215.htm">上一层</a>][<a href="225.htm">下一篇</a>]
<hr><p align="left"><small>发信人: SingleBoy (孤鹰★忧伤的夜鸟), 信区: Linux <br>

标  题: SmartGirl-0.0.0-beta1 <br>

发信站: 华南网木棉站 (Tue Jan  4 04:23:32 2000), 转信 <br>

  <br>

  <br>

/**************************************************************** <br>

*        本程序遵循 GPL 发布, 可以自由和免费地被复制, 使用 <br>

*            发布的目的是使它有用, 不提供任何承诺和保障. <br>

* <br>

*        如果本程序被修改, 您必须保证本段文字随改动后的程序 <br>

*            一起发布, 并且修改者的信息追加到下面的作者列表 <br>

*            的后面 <br>

* <br>

*                作    者: Rocky S. Lee <br>

*                邮    箱: coolrocky@21cn.com <br>

*****************************************************************/ <br>

#include <fcntl.h> <br>

#include <pthread.h> <br>

#include <stdio.h> <br>

#include <stdlib.h> <br>

#include <string.h> <br>

#include <sys/select.h> <br>

#include <sys/stat.h> <br>



#include <sys/time.h> <br>

#include <sys/types.h> <br>

#include <termios.h> <br>

#include <unistd.h> <br>

  <br>

#define VERSION "0.0.0-beta1" <br>

  <br>

#define MAX_FD_NUM              20 <br>

  <br>

#define TRUE    1 <br>

#define FALSE   0 <br>

  <br>

#define FAILED                  -1 <br>

#define SUCCESS                 0 <br>

#define NICKNAME_UNKNOWN        1 <br>

#define LOGIN_NAME_ERROR        2 <br>

//HERE CAN DEFINE OTHER CONSTANTS <br>

  <br>

char* error[] = { <br>

        "Success.", <br>

        "The LOGIN NAME may be wrong." <br>

}; <br>

}; <br>

  <br>

#define TIME_OUT 60 <br>

  <br>

#define MAXPATHLEN 4095 <br>

#define COMMAND "telnet" <br>

  <br>

struct account_info { <br>

        char nickname[32]; <br>

        char realaddress[32]; <br>

}; <br>

  <br>

int setup_mode(struct termios* old_term_param); <br>

int reset_mode(struct termios* old_term_param); <br>

  <br>

int read_string(int handle, char* buffer, int buf_len); <br>

  <br>

int get_account_info(char* nickname, struct account_info* info_record); <br>

int enjoy_it(int fd_read, int fd_write); <br>

  <br>

int main(int argc, char* argv[]) <br>

{ <br>

        int fd_read, fd_write, f_in[2], f_out[2]; <br>



        char* argus[3]; <br>

        char* version = VERSION; <br>

        struct account_info info_record; <br>

        pthread_t* thread_anti_idle_id; <br>

  <br>

        printf(";34mThanks for using SmartGirl %s!\n0m", version); <br>

  <br>

        if (argc <2) { <br>

                printf("Too few arguments!\n"); <br>

                printf("Usage:\n\t%s <NICK NAME>\n", argv[0]); <br>

                exit(0); <br>

        } <br>

  <br>

        if (get_account_info(argv[1], &info_record) != 0) { <br>

                printf("The target \"%s\" is unknown ...\n", argv[1]); <br>

                /* The code passes argv[1] to telnet goes here */ <br>

                exit(1); <br>

        } <br>

  <br>

        pipe(f_in); <br>

        pipe(f_out); <br>

        switch (fork()) { <br>



                case -1:                        /* cannot fork child process */ <br>

                        perror("Cannot fork a subroutine.\n"); <br>

                        exit(1); <br>

                case 0:                 /* child process */ <br>

                        dup2(f_in[0], STDIN_FILENO); <br>

                        close(f_in[0]); <br>

                        close(f_in[1]); <br>

                        dup2(f_out[1], STDOUT_FILENO); <br>

                        close(f_out[0]); <br>

                        close(f_out[1]); <br>

                        argus[0] = COMMAND; <br>

                        argus[1] = info_record.realaddress; <br>

                        argus[2] = NULL; <br>

                        if ((execvp("telnet", &argus[0]))<0) { <br>

                                perror("The execvp of command faild ...\n"); <br>

                                exit(1); <br>

                        } <br>

                        break; <br>

                default:                        /* parent process */ <br>

                        close(f_in[0]); <br>

                        fd_write = f_in[1]; <br>

                        close(f_out[1]); <br>



                        fd_read = f_out[0]; <br>

                        enjoy_it(fd_read, fd_write); <br>

                        break; <br>

        } <br>

  <br>

        close(f_in[0]); <br>

        close(f_in[1]); <br>

        close(f_out[0]); <br>

        close(f_out[1]); <br>

  <br>

        return 0; <br>

} <br>

  <br>

int get_account_info(char* nickname, struct account_info* info_record) <br>

{ <br>

        int i, conf_file, found; <br>

        char path[MAXPATHLEN]; <br>

  <br>

        if ((getenv("HOME")) == NULL) { <br>

                perror("Home directory no found!\n"); <br>

                return -1; <br>

        } <br>

        } <br>

  <br>

        strcpy(path, getenv("HOME")); <br>

        strcat(path, "/.go_rc"); <br>

  <br>

        if ((conf_file=open(path, O_RDONLY)) == -1) { <br>

                perror("Cannot open config file ...\n"); <br>

                return -1; <br>

        } <br>

  <br>

        found = 0; <br>

        while (read_string(conf_file, info_record->nickname, 32) != 0 <br>

                && read_string(conf_file, info_record->realaddress, 32) != 0) { <br>

                if ((strcmp(nickname, info_record->nickname)) == 0) { <br>

                        found = 1; <br>

                        break; <br>

                } <br>

        } <br>

        close(conf_file); <br>

  <br>

        if (found) <br>

                return SUCCESS; <br>

        else <br>

        else <br>

                return NICKNAME_UNKNOWN; <br>

} <br>

  <br>

int read_string(int handle, char* buffer, int buf_len) <br>

{ <br>

        char* bufp = buffer; <br>

        int counter = 0, i; <br>

  <br>

        for (i = 0; i < buf_len; i++) <br>

                buffer[i] = '\0'; <br>

  <br>

        while (((i = read(handle, bufp, 1)) != 0) && counter < buf_len) { <br>

                if (*bufp == ' ' || *bufp == '\t' <br>

                        || *bufp == '\n' || *bufp == '\r') { <br>

                        *bufp = '\0'; <br>

                        break; <br>

                } <br>

                counter++; <br>

                bufp++; <br>

        } <br>

  <br>

        if (counter >= buf_len) <br>



                *bufp = '\0'; <br>

  <br>

        return counter; <br>

} <br>

  <br>

int enjoy_it(int fd_read, int fd_write) <br>

{ <br>

        char buff; <br>

#define BUFFER_SIZE 1024 <br>

        char buffer[BUFFER_SIZE]; <br>

        int counter; <br>

        fd_set fdR, fdW; <br>

        struct timeval time_value; <br>

        struct termios old_term_param; <br>

  <br>

        setup_mode(&old_term_param); <br>

        while (1) { <br>

                FD_ZERO(&fdR); <br>

                FD_SET(fd_read, &fdR); <br>

                FD_SET(STDIN_FILENO, &fdR); <br>

  <br>

                time_value.tv_sec = TIME_OUT; <br>



                time_value.tv_usec = 0; <br>

                if (select(MAX_FD_NUM + 1, &fdR, NULL, NULL, &time_value) == 0) <br>

  <br>

                        buff = 12; <br>

                        write(fd_write, &buff, 1); <br>

                        continue; <br>

                } <br>

  <br>

                if (FD_ISSET(STDIN_FILENO, &fdR)) { <br>

                        if (read(STDIN_FILENO, &buff, 1) == 1) { <br>

                                if (buff == 29) { <br>

                                        write(fd_write, "\035quit\n", 6); <br>

                                        write(STDOUT_FILENO, "\n", 1); <br>

                                        break; <br>

                                } <br>

                                if (write(fd_write, &buff, 1) != 1) <br>

                                        break; <br>

                        } <br>

                } <br>

                if (FD_ISSET(fd_read, &fdR)) { <br>

                        if ((counter = read(fd_read, buffer, BUFFER_SIZE)) > 0) <br>

                                write(STDOUT_FILENO, buffer, counter); <br>



                        else <br>

                                break; <br>

                } <br>

        } <br>

        reset_mode(&old_term_param); <br>

  <br>

        return SUCCESS; <br>

} <br>

  <br>

int setup_mode(struct termios* old_term_param) <br>

{ <br>

        struct termios current_term_param; <br>

  <br>

        if (!isatty(STDIN_FILENO)) <br>

                return FAILED; <br>

  <br>

        if (tcgetattr(STDIN_FILENO, &current_term_param) == -1) <br>

                return FAILED; <br>

  <br>

        *old_term_param = current_term_param; <br>

        current_term_param.c_lflag &= ~(ECHO | ICANON | ISIG); <br>

        current_term_param.c_cc[VMIN] = 0; <br>



        current_term_param.c_cc[VTIME] = 0; <br>

        if(tcsetattr(0,TCSANOW,&current_term_param) == -1) <br>

                return FAILED; <br>

        else <br>

                return SUCCESS; <br>

} <br>

  <br>

int reset_mode(struct termios* old_term_param) <br>

{ <br>

        if (tcsetattr(STDIN_FILENO, TCSANOW, old_term_param) != 0) <br>

                return FAILED; <br>

        else <br>

                return SUCCESS; <br>

} <br>

  <br>

-- <br>

</small><hr>
<p align="center">[<a href="index.htm">回到开始</a>][<a href="215.htm">上一层</a>][<a href="225.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 + -