telnet如何保存输出内容到本地

leihu2000 2015-04-24 09:19:59
我在windows cmd中使用命令:telnet IP地址 端口
得到连续不断吐出的数据。
如何将这些数据保存到本地文本文件呢?
windwos中 >> log.txt 类似这样命令有吗
...全文
5591 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-12-19
  • 打赏
  • 举报
回复
《Unix编程艺术》
赵4老师 2017-12-18
  • 打赏
  • 举报
回复
凡是不超过1GB的文件,都不算太大。 仅供参考:
#include <stdio.h>
#include <io.h>
#include <fcntl.h>
#include <share.h>
#include <conio.h>
int fh;
int c,r;
__int64 offset,offset1,i64,n64,l64,r64;
char ln[16000+1];
int main(int argc,char **argv) {
    if (argc<2) {
        fprintf(stderr,"Usage:%s filename.txt [10]\nto reverse lines of file [default the last 10 lines,-1 for all lines].\n",argv[0]);
        return 1;
    }
    if (argc==2) n64=10i64;
    if (argc>2) sscanf(argv[2],"%I64d",&n64);
    fh=_sopen(argv[1],_O_BINARY|_O_RDONLY|_O_RANDOM,_SH_DENYNO);
    if (-1==fh) {
        fprintf(stderr,"Can not _sopen file %s!\n",argv[1]);
        return 2;
    }
    l64=_filelengthi64(fh);if (l64==0i64) {_close(fh);return 0;}
    offset=l64;
    offset1=_lseeki64(fh,-1i64,SEEK_END);
    if (offset1==-1i64) {_close(fh);return 3;}
    i64=0i64;
    while (1) {
        if (_read(fh,&c,1)<1) break;//
        if (('\n'==c && offset1<l64-1i64) || offset1==0i64) {
            if (offset1!=0i64) offset1++;
            if (_lseeki64(fh,offset1,SEEK_SET)==-1i64) break;//
            r64=offset-offset1;
            if (r64<=16000i64) {
                r=_read(fh,ln,(unsigned int)r64);
                if (r<=0) break;//
            } else {
                r=16000;
                while (1) {
                    if (r64>(__int64)r) {
                        r64-=(__int64)r;
                        if (1i64==r64 || 2i64==r64) {
                            r=8000;
                            r64+=(__int64)r;
                        }
                    } else {
                        r=(int)r64;
                        r64=0i64;
                    }
                    r=_read(fh,ln,r);
                    if (r<=0) break;//
                    if (0i64==r64) break;//
                    ln[r]=0;
                    printf("%s",ln);
                    r=16000;
                }
                if (r<=0) break;//
            }
            ln[r]=0;
            if (r>=2 && ln[r-1]=='\n' && ln[r-2]=='\r') {ln[r-2]='\n';ln[r-1]=0;r--;}//避免输出重定向到文件时行尾多出'\r'
            if (i64==0I64) {
                if ('\n'!=ln[r-1]) printf("%s\n",ln);
                else               printf("%s",ln);
            } else {
                printf("%s",ln);
            }
            i64++;
            if ((i64%10000)==0) cprintf("\r%I64d/%I64d",offset1,l64);
            if (n64>0i64 && i64>=n64) break;//
            offset=offset1;
            _lseeki64(fh,offset1-2i64,SEEK_SET);
            offset1-=2i64;
        } else {
            _lseeki64(fh,-2i64,SEEK_CUR);
            offset1--;
        }
    }
    _close(fh);
    return 0;
}
月光xia漫步 2017-12-18
  • 打赏
  • 举报
回复
@zhao4zhong1 目前对端只提供telnet的数据传输。因为数据后续还需要处理【想着使用shell】处理,所以,需要把telnet的输出落地成文件。 但是现在遇到的问题是:我如何进行文件的切割,毕竟一直写一个文件,文件太大了。 请指教……
引用 3 楼 zhao4zhong1 的回复:
使用命令重定向操作符可以使用重定向操作符将命令输入和输出数据流从默认位置重定 向到不同的位置。输入或输出数据流的位置即为句柄。 下表将列出可用的句柄。 句柄 句柄的数字代号 描述 STDIN 0 键盘输入 STDOUT 1 输出到命令提示符窗口 STDERR 2 错误输出到命令提示符窗口 UNDEFINED 3-9 这些句柄由应用程序单独定义,并且是各个工具特定的。 ……
月光xia漫步 2017-12-18
  • 打赏
  • 举报
回复
看你发的内容,都是从标准输入获取数据,也就是后续程序运行的方式,通过如下的方式
telnet ip地址 端口| c程序
因为有些数据需要过滤+筛选,我感觉使用脚本,比较方便,所以,最终的处理方式就变成了如下:
telnet ip地址 端口| shell 脚本处理 | c程序
c程序里面负责文件的切断处理。这样一比较,感觉不错,
引用 7 楼 zhao4zhong1 的回复:
使用管道。 仅供参考:
#include <stdio.h>
#include <string.h>
...
赵4老师 2017-12-18
  • 打赏
  • 举报
回复
使用管道。 仅供参考:
#include <stdio.h>
#include <string.h>
FILE *f;
int c;
void main(int argc,char **argv) {
    if (argc==3) {
        if (stricmp(argv[1],"-a")) goto USAGE;
        f=fopen(argv[2],"a");
        if (NULL==f) goto FNULL;
        goto FOK;
    } else if (argc==2) {
        if (0==strcmp(argv[1],"/?")) {
        USAGE:
            fprintf(stderr,"Usage: program | tee [-a] file\n");
            return;
        }
        f=fopen(argv[1],"w");
        if (NULL==f) goto FNULL;
    FOK:
        while (1) {
            c=getchar();
            if (EOF==c) break;
            if (EOF==fputc(c,f)) {
                putchar(c);
                break;
            } else {
                if (EOF==putchar(c)) break;
            }
        }
        fclose(f);
    } else {
    FNULL:
        while (1) {
            c=getchar();
            if (EOF==c) break;
            if (EOF==putchar(c)) break;
        }
    }
}
月光xia漫步 2017-12-18
  • 打赏
  • 举报
回复
感谢您的回复…… 因为我数据是对端持续送过来的,而且我收到内容之后,还需要筛选、过滤处理,之后再落地成文件送给另一个程序处理。 所以我感觉问题的关键,如何把数据切割成不同的文件。 而且,数据一旦不接受,数据就会丢失。
引用 5 楼 zhao4zhong1 的回复:
凡是不超过1GB的文件,都不算太大。 仅供参考:
#include <stdio.h>
#include <io.h>
#include <fcntl.h>
#include <share.h>
#include <conio.h>
...
leihu2000 2015-04-24
  • 打赏
  • 举报
回复
每分钟吐出的数据量大概是50M大小
赵4老师 2015-04-24
  • 打赏
  • 举报
回复
使用命令重定向操作符可以使用重定向操作符将命令输入和输出数据流从默认位置重定 向到不同的位置。输入或输出数据流的位置即为句柄。 下表将列出可用的句柄。 句柄 句柄的数字代号 描述 STDIN 0 键盘输入 STDOUT 1 输出到命令提示符窗口 STDERR 2 错误输出到命令提示符窗口 UNDEFINED 3-9 这些句柄由应用程序单独定义,并且是各个工具特定的。 数字 0 到 9 代表前 10 个句柄。可以使用命令 Cmd.exe 运行程序并将该程序前 10 个 句柄中的任何一个重定向。要指定想使用的句柄,可在重定向操作符前面键入该句柄的 数字。如果未定义句柄,则默认的 < 重定向输入操作符是 0,而默认的 > 重定向输出 操作符是 1。键入 > 或 < 操作符之后,必须指定要读取或写入数据的位置。可以指定 文件名或另一个现有的句柄。 要指定重定向到现有句柄,请使用与 (&) 字符,后面接要重定向的句柄号 (例如 &句柄#)。例如,下面的命令可以将句柄 2(即 STDERR)重定向到 句柄 1(即 STDOUT): 2>&1 下表列出了可用于将输入和输出数据流进行重定向的操作符。 重定向操作符 描述 > 将命令输出写入到文件或设备(例如打印机)中,而不是写在命令提示符窗口或句柄中。 < 从文件中而不是从键盘或句柄中读入命令输入。 >> 将命令输出添加到文件末尾而不删除文件中的信息。 >& 将一个句柄的输出写入到另一个句柄的输入中。 <& 从一个句柄读取输入并将其写入到另一个句柄输出中。 | 从一个命令中读取输出并将其写入另一个命令的输入中。也称作管道。 默认情况下,可以从键盘将命令输入(即 STDIN 句柄)发送到 Cmd.exe,然后由 Cmd.exe 将命令输出(即 STDOUT 句柄)发送到命令提示符窗口。 重定向输入 (<) 要将键盘输入重定向到文件或设备,请使用 < 操作符。例如,要从 File.txt 获取 sort 命令的输入,请键入: sort<file.txt File.txt 的内容将以字母顺序列表的方式显示在命令提示符窗口中。 < 操作符可以打开具有只读访问的指定文件名。所以,不能使用该操作符向文件中写入 信息。例如,如果以 <&2 启动程序,则所有试图读取句柄 0 的操作都将失败,因为句 柄 2 最初是以只写访问打开的。 注意 0 是 < 重定向输入操作符的默认句柄。 重定向输出 (>) 几乎所有的命令都将输出发送到命令提示符窗口。即使将输出发送到驱动器或打印机的 命令也会在命令提示符窗口显示消息和提示。 要将输出从命令提示符窗口重定向到文件或设备,请使用 > 操作符。可以在许多命令中 使用该操作符。例如,要将 dir 输出重定向到 Dirlist.txt,请键入: dir>dirlist.txt 如果 Dirlist.txt 不存在,Cmd.exe 将创建该文件。如果 Dirlist.txt 存在,Cmd.exe 将使用 dir 命令的输出替换文件中的信息。 要运行 netsh routing dump 命令,然后将输出发送到 Route.cfg,请键入: netsh routing dump>c:\route.cfg > 操作符可以打开具有只写访问属性的指定文件。所以,不能使用该操作符读取文件。 例如,如果使用重定向 >&0 启动程序,则所有试图写入句柄 1 的操作都将失败,因为 句柄 0 最初是以只读访问打开的。 注意 1 是 > 重定向输出操作符的默认句柄。 复制句柄 重定向操作符 & 可以将输出或输入从一个指定句柄复制到另一个指定的句柄。例如, 要将 dir 输出发送到 File.txt 并将错误输出发送到 File.txt,请键入: dir>c:\file.txt 2>&1 复制句柄时,可以复制该句柄原状态的所有特性。例如,如果一个句柄具有只写访问的 属性,则该句柄的所有副本都具有只写访问属性。不能将一个具有只读访问属性的句柄 复制到另一个具有只写访问属性的句柄。 使用 & 操作符重定向输入和副本 要将重定向输入操作符 (<) 与复制操作符 (&) 一起使用,指定的文件必须已经存在。 如果输入文件存在,Cmd.exe 将以只读方式打开该文件,然后将文件中包含的字符作为 输入发送到此命令(如同从键盘输入一样)。如果指定了句柄,Cmd.exe 将指定的句柄 复制到系统现有的句柄中。 例如,要以句柄 0 输入读取(即 STDIN)的方式打开 File.txt,请键入: <file.txt 要打开 File.txt,并在内容排序后将输出发送到命令提示符窗口(即 STDOUT),请键入: sort<file.txt 要查找 File.txt,然后将句柄 1(即 STDOUT)和句柄 2(即 STDERR)重定向到 Search.txt,请键入: findfile file.txt>search.txt 2<&1 要以句柄 0 输入读取(即 STDIN)的方式复制用户定义句柄 3,请键入: <&3 使用 & 操作符重定向输出和复制 如果将输出重定向到文件且指定了现有的文件名,Cmd.exe 将以只写方式打开文件并覆 盖该文件内容。如果指定了句柄,Cmd.exe 将文件复制到现有句柄中。 要将用户定义句柄 3 复制到句柄 1,请键入: >&3 要将包括句柄 2(即 STDERR)的所有输出从 ipconfig 命令重定向到 句柄 1(即 STDOUT),然后将输出重定向到 Output.log,请键入: ipconfig.exe>>output.log 2>&1 使用 >> 重定向操作符追加输出 要从命令中将输出添加到文件末尾而不丢失文件中已存在的任何信息,请使用两个连续 的大于号(即 >>)。例如,下面的命令可以将由 dir 命令生成的目录列表追加到 Dirlist.txt 文件: dir>>dirlist.txt 要将 netstat 命令的输出追加到 Tcpinfo.txt 的末尾,请键入: netstat>>tcpinfo.txt 使用管道操作符 (|) 管道操作符 (|) 可以提取一个命令的输出(默认情况下是 STDOUT),然后将其导入另 一个命令的输入中(默认情况下是 STDIN)。例如,下面的命令将对目录分类: dir | sort 在本例中,将同时启动两个命令,但随后 sort 命令会暂停,直到它接收到 dir 命令 的输出为止。sort 命令使用 dir 命令的输出作为输入,然后将输出发送到 句柄 1(即 STDOUT)。 合并带重定向操作符的命令 可以通过合并带有其他命令和文件名的筛选器命令创建自定义命令。例如,可以使用以 下命令存储包含“LOG”字符串的文件名: dir /b | find "LOG" > loglist.txt dir 命令的输出通过 find 筛选器命令发送。包含字符串 "LOG" 的文件名作为文件名 列表(例如,NetshConfig.log、Logdat.svd 和 Mylog.bat)存储在文件 Loglist.txt 中。 要在相同命令中使用多个筛选器,请使用管道 (|) 分隔筛选器。例如,下面的命令将 搜索 C 盘上的每个目录以查找包含 "LOG" 字符串的文件名,并且在命令提示符窗口中 每次显示一屏: dir c:\ /s /b | find "LOG" | more 利用管道 (|) 可以将 Cmd.exe 导向为通过 find 筛选器命令发送 dir 命令输出。 find 命令只选择包含字符串 "LOG" 的文件名。more 命令可以显示由 find 命令选择 的文件名(在命令提示符窗口中每次显示一屏)。有关筛选器命令的详细信息,请参阅 使用筛选器。
翅膀又硬了 2015-04-24
  • 打赏
  • 举报
回复
你应该自己写一个客户端程序做这个事情,为什么要用telnet

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧