flyingbxf 回复于:2003-12-16 15:24:59 |
下面是在linux下运行的情况:
Connected to 61.135.129.120 (61.135.129.120). 220 hd FTP server (Version wu-2.6.2-5) ready. 331 Guest login ok, send your complete e-mail address as password. 230 Guest login ok, access restrictions apply. [color=blue:d31b7c2816]227 Entering Passive Mode (61,135,129,120,73,67) 150 Opening ASCII mode data connection for directory listing. total 40 d--x--x--x 2 root 523 4096 Jan 14 2003 bin d--x--x--x 2 root 523 4096 Jan 14 2003 etc drwxr-xr-x 2 root 523 4096 Jan 14 2003 lib drwx-wx-wx 140 523 523 8192 Dec 13 05:41 pub 226 Transfer complete.[/color:d31b7c2816] 221-You have transferred 0 bytes in 0 files. 221-Total traffic for this session was 416 bytes in 0 transfers. 221-Thank you for using the FTP service on hd. 221 Goodbye ok |
shxliang 回复于:2003-12-16 17:34:13 |
u can creat a 'XXX.sh' function, and use the 'system()' . |
shxliang 回复于:2003-12-16 17:35:18 |
flyingbxf 回复于:2003-12-17 08:52:26 |
[quote:c83f63b477="shxliang"]u can creat a 'XXX.sh' function, and use the 'system()' .[/quote:c83f63b477]
大虾:能不能详细点?'XXX.sh' 完成什么工作?用脚本写?可是uclinux的sh 不支持管道的阿 |
flyingbxf 回复于:2003-12-17 08:55:05 |
[quote:cef471cfd3="shxliang"]u can creat a 'XXX.sh' function, and use the 'system()' .[/quote:cef471cfd3]
大虾:能不能详细点?'XXX.sh' 完成什么工作?用脚本写?可是uclinux的sh 不支持管道的阿 |
shxliang 回复于:2003-12-22 20:56:52 |
你应该知道脚本怎样实现自动ftp吧,
你内核编译的时候加上busybox就可以了,把默认的shell改成sh,而不是sash, 或者你用c 来实现管道也可以啊! |
shxliang 回复于:2003-12-22 20:57:41 |
你应该知道脚本怎样实现自动ftp吧,
你内核编译的时候加上busybox,把默认的shell改成sh,而不是sash,就可以了 当然,用system()也可以了, 或者你用c 来实现管道也可以啊! |
flyingbxf 回复于:2003-12-23 09:01:34 |
[quote:5abeb761d8="shxliang"]你应该知道脚本怎样实现自动ftp吧,
你内核编译的时候加上busybox,把默认的shell改成sh,而不是sash,就可以了 当然,用system()也可以了, 或者你[color=red:5abeb761d8]用c 来实现管道[/color:5abeb761d8]也可以啊![/quote:5abeb761d8] 脚本登陆我是知道的,试验成功了。但我就是想用C语言来实现。上面的程序中popen不是创建管道吗?我就是奇怪啊,上面的C程序为什么不能在uClinux下实现?按说C程序编译后,用不到shell了啊! |
shxliang 回复于:2003-12-23 11:30:03 |
uclinux 确实不支持管道,也不支持重定向(默认),
我现在没有uclinux环境来做实验, 你先照我说的,加上重定向试试, 当你用make menuconfig将busybox编译进去之后, 把默认sash改成sh后shell提示符不再是#了,好像是\>了.可以验证一下. 用脚本来实现自动ftp,然后在system函数中调用这个脚本. |
flyingbxf 回复于:2003-12-23 17:06:53 |
[quote:17fa878edc="shxliang"]uclinux 确实不支持管道,也不支持重定向(默认),
当你用make menuconfig将busybox编译进去之后, 把默认sash改成sh后shell提示符不再是#了,好像是\>了..........[/quote:17fa878edc] 现在的shell提示符也是[color=red:17fa878edc]\>[/color:17fa878edc]。主要是我现在在做一个项目,内核是别人帮我编译好的,不敢随便动啊。菜菜啦! 另外,问一个C语言编程的问题,能不能用fopen函数建立一个,文件名是[color=red:17fa878edc]变量[/color:17fa878edc]的文件啊。也就是说正常情况下: [color=blue:17fa878edc]stream = fopen("DUMMY.FIL", "w+"); [/color:17fa878edc] 能不能将DUMMY.FIL换成变量啊?比方说 char *pf; stream =fopen (pf, "w+"); |
shxliang 回复于:2003-12-25 21:56:15 |
那你这样应该可以了!
#include<stdio.h> #include<unistd.h> main(int argc,char **argv) { FILE *fp; fp=popen("ftp -inv","w"); if(fp==NULL) { perror("popen"); exit(1); } fprintf(fp,"open 192.168.2.3\n"); fprintf(fp,"user anonymous @\n"); fprintf(fp,"ls\n"); pclose(fp); printf("ok\n"); } |
飞灰橙 回复于:2003-12-25 22:26:24 |
[quote:9e6e49afa4="shxliang"]uclinux 确实不支持管道,也不支持重定向(默认),
我现在没有uclinux环境来做实验, [/quote:9e6e49afa4] uClinux还是支持管道的,pipe和dup都可以正常调用, 可以去一试便知。 你说的管道必定是指sash里没法用|了。 |
flyingbxf 回复于:2003-12-26 09:17:20 |
是不是因为这样:
(taken from popen man page:) "The popen() function opens a process by creating a pipe, forking, and invoking the shell." uClinux是不能用fork的,但popen默认的是用fork来创建子进程。所以会出现同样的程序在linux下可以运行,在uC下就不能运行了。 |
shxliang 回复于:2003-12-26 11:28:37 |
uclinux 可以用fork,但是功能和vfork一样,
飞灰橙大哥说的极是,我说重定向和管道是指sash不支持 但c可以实现, 上面的ftp代码不知道你试过没有,应该没有问题的,(: |
flyingbxf 回复于:2003-12-26 12:20:28 |
shxliang大哥(小弟?:)俺22),别忙着生气,我编译了还没运行,代回给你会话 |
flyingbxf 回复于:2003-12-26 14:18:03 |
[quote:c20655c8db="shxliang"]uclinux 可以用fork,但是功能和vfork一样,
飞灰橙大哥说的极是,我说重定向和管道是指sash不支持 但[color=red:c20655c8db]c可以实现[/color:c20655c8db], 上面的ftp代码不知道你试过没有,应该没有问题的,(:[/quote:c20655c8db] :em02: 可以实现了,shxliang大哥说的没错。但我觉得跟上面的那个程序没有太大的不同啊,能说一下原委吗? |
shxliang 回复于:2003-12-26 21:02:28 |
我原来是想自己pipe一个管道,但没试,(:
其实原理还是一样的,你可以看一下popen的源码. 我以前做的时候,是用脚本来的,开头也是不行, 郁闷了很久,后来问了高手才解决的. 要学的东西太多了,楼上的飞灰橙应该是高手,呵呵 你现在在作什么? |
flyingbxf 回复于:2003-12-27 11:00:18 |
俺在做嵌入式,呵呵,学习ing…… 啥都不懂。
再问你一个问题:不管用何种方式登陆ftp,其返回信息都是直接在屏幕上输出的,我如何能在程序中截取这些信息,以判断文件传输是否成功呢?看了一点关于标准输入输出流的东东,还是不明白。 |
shxliang 回复于:2003-12-27 11:16:44 |
最简单的就是在脚本里用重定向了,'>' 和">>"符号,最简单,你可以看看相关书. |
flyingbxf 回复于:2003-12-27 11:24:55 |
[quote:5861aa8ed0="shxliang"]最简单的就是在脚本里用重定向了,'>' 和">>"符号,最简单,你可以看看相关书.[/quote:5861aa8ed0]
还是uC的问题呀,sash也不支持重定向的啊!在C程序中,使用重定向可以吗?不知道有没有例子,参考一下? |
shxliang 回复于:2003-12-27 11:54:06 |
#include <stdio.h>
#include <unistd.h> int main(void) { FILE *fp; int fd; if((fp=fopen("test.txt","w")) == NULL){ printf("fopen error!\n"); exit(1); } fd=fileno(fp); if(dup2(fd,STDOUT_FILENO)==-1){ fprintf(stderr,"Redirect Standard Out Error"); exit(1); } system("./autoftp"); } 你试试,呵呵! |
flyingbxf 回复于:2003-12-29 11:06:16 |
好用,谢谢大虾。这样我就可以通过读文件来判断传送成功与否了。另外还有个问题就是,我用的ftp原码是别人给我的,但我发现有如下问题:
当登陆成功后,可以无限制地dir 或 ls ,cd 等都没问题。但只能上传一次,没执行一次send 或 put 不管成功与否,ftp都断掉了。 你看可能的原因是什么呢? |
shxliang 回复于:2003-12-30 09:48:52 |
你是在shell里头还是上面那个函数里头!不行的话,你用mget或者mput试试! |
flyingbxf 回复于:2003-12-30 10:04:39 |
shell和函数里面都是这样。我怀疑是我的ftp原码的问题,因为调用的都是同一个ftp ,对吧? |
flyingbxf 回复于:2003-12-30 13:19:51 |
[quote:782330f15a="shxliang"]你是在shell里头还是上面那个函数里头!不行的话,你用mget或者mput试试![/quote:782330f15a]
这是我用[color=red:782330f15a]put[/color:782330f15a]发送文件的过程: ftp> put /etc/hosts ./ho.txt local: /etc/hosts [color=red:782330f15a]remote: ./ho.txt[/color:782330f15a] 200 PORT Command successful. 150 Opening ASCII mode data connection for ho.txt. 226 Transfer complete. 118 bytes sent in 0 secs (118 Kbytes/sec) ftp> dir pid 22: failed 4 /> 这是我用[color=red:782330f15a]mput[/color:782330f15a]的过程 ftp> mput /etc/hosts ./ho.txt local: /etc/hosts [color=red:782330f15a]remote: /etc/hosts[/color:782330f15a] 200 PORT Command successful. 550 hosts: Cannot create file. local: ./ho.txt remote: ./ho.txt local: ./ho.txt: Unknown error 22 ftp> dir ftp> close ftp> bye ftp> 也不退出, 不知道是何原因? |
shxliang 回复于:2004-01-01 20:32:59 |
我也不知道原因,
ftp> mput a.c b.c mput a.c? y 227 Entering Passive Mode (192,168,0,13,30,83) 150 Opening BINARY mode data connection for a.c. 226 Transfer complete. 108 bytes sent in 6.4e-05 seconds (1.6e+03 Kbytes/s) mput b.c? y 227 Entering Passive Mode (192,168,0,13,83,195) 150 Opening BINARY mode data connection for b.c. 226 Transfer complete. 1896 bytes sent in 7.2e-05 seconds (2.6e+04 Kbytes/s) ftp> ----------------------------------- ftp> put a.c b.c local: a.c remote: b.c 227 Entering Passive Mode (192,168,0,13,9,8) 150 Opening BINARY mode data connection for b.c. 226 Transfer complete. 108 bytes sent in 6.4e-05 seconds (1.6e+03 Kbytes/s) 你就一个文件一个文件传么,应该可以的! |
flyingbxf 回复于:2004-01-02 09:53:31 |
下面是我的运行结果:
ftp> mput /etc/hosts mput /etc/hosts? y 200 PORT Command successful. 550 hosts: Cannot create file. ftp> ls ftp> dir ftp> bye ftp> bye ftp> ftp也退不出来。看来就是我用的ftp不好了。 另外,还有个小问题: 在命令行敲命令传输文件的返回信息,传输成功的话会有: 226 Transfer complete. [color=red:3dc4effa03]xxx(当然是不确定的啦)[/color:3dc4effa03] bytes sent in 0 secs (xxx Kbytes/sec) 但我用if(dup2(fd,STDOUT_FILENO)==-1) 的话,在产生的log文件里面没有最后一句啊。 |
flyingbxf 回复于:2004-01-02 10:04:07 |
又试了一下,传输倒是成功了不过还是无法接受后续命令。如下:
ftp> mput ftp(这次没有加路径,传输的是运行ftp的目录下的一个文件,名字叫ftp) mput ftp? y 200 PORT Command successful. 150 Opening ASCII mode data connection for ftp. 226 Transfer complete. 843 bytes sent in 0 secs (843 Kbytes/sec) ftp> dir ftp> dir(dir 还是不起作用了) |
flyingbxf 回复于:2004-01-05 15:31:43 |
[quote:b735340153="flyingbxf"]在命令行敲命令传输文件的返回信息,传输成功的话会有:
226 Transfer complete. xxx(当然是不确定的啦) bytes sent in 0 secs (xxx Kbytes/sec) 但我用if(dup2(fd,STDOUT_FILENO)==-1) 的话,在产生的log文件里面没有最后一句啊。 [/quote:b735340153] 困惑ing…… |
hanni 回复于:2004-05-21 12:04:06 |
能否总结一下给与参考呢?谢谢 |
flyingbxf 回复于:2004-05-21 17:23:35 |
[quote:5b9bc7d9e1="hanni"]能否总结一下给与参考呢?谢谢[/quote:5b9bc7d9e1]
至今未解决 |