Networking ftp服务器的实施问题;列表“;
我正在实现FTP服务器,这里将winscp作为一个客户端。每当客户端向我(服务器)发送PASV命令时,我都会向客户端发送带有ip地址和端口的应答,然后客户端发送LIST命令,然后我将响应作为Networking ftp服务器的实施问题;列表“;,networking,tcp,ftp,winscp,Networking,Tcp,Ftp,Winscp,我正在实现FTP服务器,这里将winscp作为一个客户端。每当客户端向我(服务器)发送PASV命令时,我都会向客户端发送带有ip地址和端口的应答,然后客户端发送LIST命令,然后我将响应作为 150 Opening ASCII mode data connection for file list -rwxrwxr-x 1 elmpc-162 elmpc-162 17608 Sep 16 12:13 a.out 226 File transfer completed... 我在第二个端口发送这些
150 Opening ASCII mode data connection for file list
-rwxrwxr-x 1 elmpc-162 elmpc-162 17608 Sep 16 12:13 a.out
226 File transfer completed...
我在第二个端口发送这些响应
与此类似,但winscp总是显示“8检索目录列表失败**”
但是,如果我在winscp的日志中看到,我发送给客户机的任何数据都不存在
你可以看到日志
. 2020-09-17 16:02:54.408 Username prompt (no username provided)
. 2020-09-17 16:03:00.663 Connecting to 192.168.5.37:5005 ...
. 2020-09-17 16:03:00.663 Connected with 192.168.5.37:5005. Waiting for welcome message...
< 2020-09-17 16:03:00.663 220 Welcome to Alan's FTP site
> 2020-09-17 16:03:00.663 USER srihari
< 2020-09-17 16:03:00.663 331 Password required
> 2020-09-17 16:03:04.064 PASS *****
< 2020-09-17 16:03:04.064 230 Public login sucessful
> 2020-09-17 16:03:04.064 SYST
< 2020-09-17 16:03:04.064 215 AmigaOS
> 2020-09-17 16:03:04.064 FEAT
< 2020-09-17 16:03:04.064 202 Command not implemented, superfluous at this site.
. 2020-09-17 16:03:04.079 Connected
. 2020-09-17 16:03:04.079 --------------------------------------------------------------------------
. 2020-09-17 16:03:04.079 Using FTP protocol.
. 2020-09-17 16:03:04.079 Doing startup conversation with host.
> 2020-09-17 16:03:04.095 PWD
< 2020-09-17 16:03:04.095 257 "/home/elmpc-162/ftp_server"
. 2020-09-17 16:03:04.095 Getting current directory name.
. 2020-09-17 16:03:04.142 Retrieving directory listing...
> 2020-09-17 16:03:04.142 TYPE A
< 2020-09-17 16:03:04.142 200 Switching to ASCII mode.
> 2020-09-17 16:03:04.142 PASV
< 2020-09-17 16:03:04.142 227 Entering Passive Mode (192,168,5,37,23,112)
> 2020-09-17 16:03:04.142 LIST -a
. 2020-09-17 16:03:04.142 Connecting to 192.168.5.37:6000 ...
. 2020-09-17 16:03:19.757 Timeout detected. (data connection)
。2020-09-17 16:02:54.408用户名提示(未提供用户名)
. 2020-09-17 16:03:00.663连接到192.168.5.37:5005。。。
. 2020-09-17 16:03:00.663与192.168.5.37:5005相连。正在等待欢迎消息。。。
<2020-09-17 16:03:00.663 220欢迎来到艾伦的FTP网站
>2020-09-17 16:03:00.663用户srihari
<2020-09-17 16:03:00.663 331需要密码
>2020-09-17 16:03:04.064通行证*****
<2020-09-17 16:03:04.064 230公共登录成功
>2020-09-17 16:03:04.064系统
<2020-09-17 16:03:04.064 215阿弥陀佛
>2020-09-17 16:03:04.064壮举
<2020-09-17 16:03:04.064 202命令未执行,此站点多余。
. 2020-09-17 16:03:04.079已连接
. 2020-09-17 16:03:04.079 --------------------------------------------------------------------------
. 2020-09-17 16:03:04.079使用FTP协议。
. 2020-09-17 16:03:04.079与主机进行启动对话。
>2020-09-17 16:03:04.095 PWD
<2020-09-17 16:03:04.095 257”/home/elmpc-162/ftp_服务器
. 2020-09-17 16:03:04.095获取当前目录名。
. 2020-09-17 16:03:04.142正在检索目录列表。。。
>2020-09-17 16:03:04.142 A类
<2020-09-17 16:03:04.142 200切换到ASCII模式。
>2020-09-17 16:03:04.142帕斯卡
<2020-09-17 16:03:04.142 227进入被动模式(192168,5,37,23112)
>2020-09-17 16:03:04.142列表-a
. 2020-09-17 16:03:04.142连接到192.168.5.37:6000。。。
. 2020-09-17 16:03:19.757检测到超时。(数据连接)
但在服务器中,它显示客户端已连接
在这里,我无法找出,为什么列表的响应不进行
有人能帮我吗
这是我的密码
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h> //Header file for sleep(). man 3 sleep for details.
#include <pthread.h>
#include <stdio.h>
#include <netdb.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#define MAX 80
#define PORT1 5013
#define PORT2 6004
#define SA struct sockaddr
#define SA struct sockaddr
char read_buffer[200],write_buffer[200];
char check=0;
void call_second(void);
// A normal C function that is executed as a thread
// when its name is specified in pthread_create()
void *first_thread(void *vargp)
{
printf("in first thread.....\n");
int sockfd, connfd, len;
struct sockaddr_in servaddr, cli;
// socket create and verification
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == -1) {
printf("socket creation failed...\n");
exit(0);
}
else
printf("Socket successfully created..\n");
bzero(&servaddr, sizeof(servaddr));
// assign IP, PORT
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(PORT1);
// Binding newly created socket to given IP and verification
if ((bind(sockfd, (SA*)&servaddr, sizeof(servaddr))) != 0) {
printf("socket bind failed...\n");
exit(0);
}
else
printf("Socket successfully binded..\n");
// Now server is ready to listen and verification
if ((listen(sockfd, 5)) != 0) {
printf("Listen failed...\n");
exit(0);
}
else
printf("Server listening..\n");
len = sizeof(cli);
// Accept the data packet from client and verification
connfd = accept(sockfd, (SA*)&cli, &len);
if (connfd < 0) {
printf("server acccept failed...\n");
exit(0);
}
else
printf("server acccept the client...\n");
//bzero(buffer, 0);
// sprintf(buffer,"\n220 Welcome to Alan's FTP site \r\n\n");
//for (;;)
//write(sockfd, "welcome", sizeof("welcome"));
// Function for chatting between client and server
//printf("after writing into sockbuffer ...\n");
//func(connfd);
int n,bytes;
// infinite loop for chat
for (;;)
{
//bzero(buff, MAX);
memset(read_buffer,0,200);
memset(write_buffer,0,200);
sprintf(write_buffer,"\n220 Welcome to Alan's FTP site\r\n\n");
write(connfd, write_buffer, sizeof(write_buffer));
printf("come inside..\n");
// read the message from client and copy it in buffer
while(1)
{
//sleep(1);
memset(read_buffer,0,200);
memset(write_buffer,0,200);
//printf("before reading....\n");
bytes=read(connfd, read_buffer, sizeof(read_buffer));
//printf("checking blocking or not.. %s\n",read_buffer);
if(bytes>0)
{
printf("From client:%s%d\n", read_buffer,bytes);
}
// if(strstr(buff,"AUTH TLS")||strstr(buff,"AUTH SSL"))
// {
// sprintf(buffer,"\n502 Command not implemented\r\n\n");
// write(sockfd, buffer, sizeof(buffer));
// }
if (strstr(read_buffer,"USER"))
{
printf("Logging in \n");
sprintf(write_buffer,"331 Password required \r\n");
bytes = write(connfd, write_buffer, sizeof(write_buffer));
if (bytes < 0) break;
}
if (strncmp(read_buffer,"PASS",4)==0)
{
printf("Typing password (anything will do... \n");
sprintf(write_buffer,"230 Public login sucessful \r\n");
bytes = write(connfd, write_buffer, sizeof(write_buffer));
if (bytes < 0) break;
}
if (strncmp(read_buffer,"SYST",4)==0)
{
printf("215 AmigaOS \n");
//sprintf(write_buffer,"215 AmigaOS \r\n");
sprintf(write_buffer,"215 UNIX emulated by FileZilla \r\n");
bytes = write(connfd, write_buffer, sizeof(write_buffer));
memset(write_buffer,0,sizeof(write_buffer));
}
if (strncmp(read_buffer,"CLNT",4)==0)
{
printf("200 Don't care \n");
sprintf(write_buffer,"200 Don't care \r\n");
bytes = write(connfd, write_buffer, sizeof(write_buffer));
if (bytes < 0) break;
}
if (strncmp(read_buffer,"OPTS UTF8 ON",4)==0)
{
printf("202 UTF8 mode is always enabled. No need to send this command. \n");
sprintf(write_buffer,"202 UTF8 mode is always enabled. No need to send this command. \r\n");
bytes = write(connfd, write_buffer, sizeof(write_buffer));
if (bytes < 0) break;
}
if (strncmp(read_buffer,"FEAT",4)==0)
{
printf("211-Features: \n");
sprintf(write_buffer,"211-Features: \r\n");
bytes = write(connfd, write_buffer, sizeof(write_buffer));
sprintf(write_buffer,"MDTM \r\n");
bytes = write(connfd, write_buffer, sizeof(write_buffer));
memset(write_buffer,0,sizeof(write_buffer));
sprintf(write_buffer,"REST STREAM \r\n");
bytes = write(connfd, write_buffer, sizeof(write_buffer));
memset(write_buffer,0,sizeof(write_buffer));
sprintf(write_buffer,"MLST type*;size*;modify*; \r\n");
bytes = write(connfd, write_buffer, sizeof(write_buffer));
// memset(write_buffer,0,sizeof(write_buffer));
// sprintf(write_buffer,"MLSD \r\n");
// bytes = write(connfd, write_buffer, sizeof(write_buffer));
memset(write_buffer,0,sizeof(write_buffer));
sprintf(write_buffer,"UTF8 \r\n");
bytes = write(connfd, write_buffer, sizeof(write_buffer));
memset(write_buffer,0,sizeof(write_buffer));
sprintf(write_buffer,"CLNT \r\n");
bytes = write(connfd, write_buffer, sizeof(write_buffer));
memset(write_buffer,0,sizeof(write_buffer));
sprintf(write_buffer,"MFMT \r\n");
bytes = write(connfd, write_buffer, sizeof(write_buffer));
memset(write_buffer,0,sizeof(write_buffer));
sprintf(write_buffer,"CLNT \r\n");
bytes = write(connfd, write_buffer, sizeof(write_buffer));
memset(write_buffer,0,sizeof(write_buffer));
sprintf(write_buffer,"EPSV \r\n");
bytes = write(connfd, write_buffer, sizeof(write_buffer));
memset(write_buffer,0,sizeof(write_buffer));
sprintf(write_buffer,"EPRT \r\n");
bytes = write(connfd, write_buffer, sizeof(write_buffer));
memset(write_buffer,0,sizeof(write_buffer));
sprintf(write_buffer,"211 End \r\n");
bytes = write(connfd, write_buffer, sizeof(write_buffer));
memset(write_buffer,0,sizeof(write_buffer));
printf("211 end: \n");
}
if (strncmp(read_buffer,"PWD",3)==0)
{
printf("present working directory \n");
// FILE *fpipe;
char pwd[100],i=5;
// char *command = "pwd";
// char c = 0;
// if (0 == (fpipe = (FILE*)popen(command, "r")))
// {
// perror("popen() failed.");
// exit(EXIT_FAILURE);
// }
// strcat(pwd,"257 \"");
// printf("%s\n",pwd);
// while (fread(&c, sizeof c, 1, fpipe))
// {
// //printf("%c", c);
// pwd[i++]=c;
// }
// strcat(pwd,"\" \r\n");
memset(pwd,0,sizeof(pwd));
// strcat(pwd,"257 \"/\"\r\n");
strcat(pwd,"257 \"/home/elmpc-162/ftp_server\" ");
printf("%s\n",pwd);
//pclose(fpipe);
// sprintf(write_buffer,"202 Command not implemented, superfluous at this site. \r\n");
bytes = write(connfd, pwd, sizeof(pwd));
if (bytes < 0) break;
}
if (strstr(read_buffer,"TYPE I"))
{
printf(" 200 Switching to Binary mode.\n");
sprintf(write_buffer,"200 Switching to Binary mode. \r\n");
bytes = write(connfd, write_buffer, sizeof(write_buffer));
if (bytes < 0) break;
}
if (strstr(read_buffer,"TYPE A"))
{
printf(" 200 Switching to ASCII mode.\n");
sprintf(write_buffer,"200 Switching to ASCII mode. \r\n");
bytes = write(connfd, write_buffer, sizeof(write_buffer));
if (bytes < 0) break;
}
if (strstr(read_buffer,"AUTH TLS"))
{
printf(" asking AUTHTLS\n");
sprintf(write_buffer,"502 Explicit TLS authentication not allowed \r\n");
bytes = write(connfd, write_buffer, sizeof(write_buffer));
if (bytes < 0) break;
}
if (strstr(read_buffer,"AUTH SSL"))
{
printf(" asking AUTHTLS\n");
sprintf(write_buffer,"502 Explicit TLS authentication not allowed \r\n");
bytes = write(connfd, write_buffer, sizeof(write_buffer));
if (bytes < 0) break;
}
if (strstr(read_buffer,"CDUP"))
{
printf(" got CDUP command \n");
sprintf(write_buffer,"457 \"/home\" \r\n");
bytes = write(connfd, write_buffer, sizeof(write_buffer));
if (bytes < 0) break;
}
if (strstr(read_buffer,"CWD"))
{
printf(" got CWD command \n");
sprintf(write_buffer,"457 \"/home/elmpc-162/ftp_server\" \r\n");
bytes = write(connfd, write_buffer, sizeof(write_buffer));
if (bytes < 0) break;
}
if (strncmp(read_buffer,"PASV",4)==0)
{int a,b;
//close(sockfd);
a=PORT2/256;
b=PORT2%256;
printf("Entering into passvie mode \n");
sprintf(write_buffer,"227 Entering Passive Mode (192,168,5,37,%d,%d) \r\n",a,b);
bytes = write(connfd, write_buffer, sizeof(write_buffer));
if (bytes < 0) break;
// check =1;
//exit(0);
}
if (strstr(read_buffer,"LIST")||strstr(read_buffer,"MLSD"))
{
sprintf(write_buffer,"150 Transfering... \r\n");
//printf("%s\n",write_buffer);
bytes = write(connfd, write_buffer, sizeof(write_buffer));
if (bytes < 0) break;
memset(write_buffer,0,sizeof(write_buffer));
//strcat(pwd,"-rwxrwxr-x 1 elmpc-162 elmpc-162 17608 Sep 16 12:13 a.out \r\n");
// sprintf(write_buffer,"type=file;modify=20200902093315;size=302; a.cfg \r\n");
// sprintf(write_buffer,"a.out \r\n");
// sprintf(write_buffer,"%s",pwd);
// write(connfd, write_buffer, sizeof(write_buffer));
call_second();
memset(write_buffer,0,sizeof(write_buffer));
sprintf(write_buffer,"226 File transfer completed... \r\n");
//printf("%s\n",write_buffer);
write(connfd, write_buffer, sizeof(write_buffer));
printf("wrote==%d\n",n);
memset(write_buffer,0,sizeof(write_buffer));
check =1;
}
// // print buffer which contains the client contents
}
n = 0;
}
return NULL;
}
void *second_thread(void *vargp)
{
while(1)
{
//printf("dfjhdkfhdf\n");
// if(check==1)
// call_second();
}
}
void call_second(void)
{
int sockfd_c, connfd_c, len_c;
struct sockaddr_in servaddr_c, cli_c;
// socket create and verification
sockfd_c = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd_c == -1) {
printf("socket creation failed...2\n");
exit(0);
}
else
printf("Socket successfully created..2\n");
bzero(&servaddr_c, sizeof(servaddr_c));
// assign IP, PORT
servaddr_c.sin_family = AF_INET;
servaddr_c.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr_c.sin_port = htons(PORT2);
// if (connect(sockfd_c, (SA*)&servaddr_c, sizeof(servaddr_c)) != 0) {
// printf("connection with the server failed...\n");
// exit(0);
// }
// else
// printf("connected to the server..\n");
// Binding newly created socket to given IP and verification
if ((bind(sockfd_c, (SA*)&servaddr_c, sizeof(servaddr_c))) != 0) {
printf("socket bind failed...2\n");
exit(0);
}
else
printf("Socket successfully binded..2\n");
// Now server is ready to listen and verification
if ((listen(sockfd_c, 5)) != 0) {
printf("Listen failed...2\n");
exit(0);
}
else
printf("Server listening..2\n");
len_c = sizeof(cli_c);
// Accept the data packet from client and verification
connfd_c = accept(sockfd_c, (SA*)&cli_c, &len_c);
if (connfd_c < 0) {
printf("server acccept failed...2\n");
exit(0);
}
else
printf("server acccept the client...2\n");
char buff[MAX];
int n;
// infinite loop for chat
//while(1)
{
if(check==1)
{
check =1;
FILE *fpipe;
int k=0;
char pwd[1500];int i=0;
char *command = "ls -l";
char c = 0;
memset(pwd,0,sizeof(pwd));
if (0 == (fpipe = (FILE*)popen(command, "r")))
{
perror("popen() failed.");
exit(EXIT_FAILURE);
}
while (fread(&c, sizeof c, 1, fpipe))
{
//printf("%c", c);
k++;
if(k>9)
pwd[i++]=c;
}
// printf("pwd==%s\n",pwd);
k=0;
memset(write_buffer,0,sizeof(write_buffer));
// strcat(pwd,"-rwxrwxr-x 1 elmpc-162 elmpc-162 17608 Sep 16 12:13 a.out1 \r\n");
// strcat(pwd,"-rwxrwxr-x 1 elmpc-162 elmpc-162 17608 Sep 16 12:14 a.out2 \r\n");
// strcat(pwd,"-rwxrwxr-x 1 elmpc-162 elmpc-162 17608 Sep 16 12:15 a.out3 \r\n");
sprintf(write_buffer,"%s",pwd);
write(connfd_c, write_buffer, sizeof(write_buffer));
sleep(3);
check=0;
}
}
// After chatting close the socket
close(sockfd_c);
printf("closed second connection...\n");
}
int main()
{
pthread_t thread_id1,thread_id2;
printf("Before Thread\n");
pthread_create(&thread_id1, NULL, first_thread, (void *)&thread_id1);
//pthread_join(thread_id1, NULL);
pthread_create(&thread_id2, NULL, second_thread, (void *)&thread_id2);
//pthread_join(thread_id2, NULL);
printf("After Thread\n");
pthread_exit(NULL);
//exit(0);
}
#包括
#包括
#包含//sleep()的头文件。男士3:详细情况请睡眠。
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#定义最大值80
#定义端口1 5013
#定义端口2 6004
#定义SA结构sockaddr
#定义SA结构sockaddr
字符读取缓冲区[200],写入缓冲区[200];
字符检查=0;
无效呼叫秒(无效);
//作为线程执行的普通C函数
//在pthread_create()中指定其名称时
void*第一个线程(void*vargp)
{
printf(“在第一个线程中…\n”);
int sockfd、connfd、len;
servaddr中的struct sockaddru,cli;
//套接字创建和验证
sockfd=套接字(AF_INET,SOCK_STREAM,0);
如果(sockfd==-1){
printf(“套接字创建失败…\n”);
出口(0);
}
其他的
printf(“套接字已成功创建..\n”);
bzero(&servaddr,sizeof(servaddr));
//分配IP、端口
servaddr.sin_family=AF_INET;
servaddr.sin\u addr.s\u addr=htonl(INADDR\u ANY);
servaddr.sinu端口=htons(端口1);
//将新创建的套接字绑定到给定的IP和验证
如果((bind(sockfd,(SA*)&servaddr,sizeof(servaddr)))!=0{
printf(“套接字绑定失败…\n”);
出口(0);
}
其他的
printf(“套接字成功绑定..\n”);
//现在服务器已准备好侦听和验证
如果((听(sockfd,5))!=0{
printf(“侦听失败…\n”);
出口(0);
}
其他的
printf(“服务器侦听..\n”);
len=sizeof(cli);
//接受来自客户端的数据包并进行验证
connfd=accept(sockfd,(SA*)&cli和len);
如果(connfd<0){
printf(“服务器访问失败…\n”);
出口(0);
}
其他的
printf(“服务器接受客户端…\n”);
//bzero(缓冲区,0);
//sprintf(缓冲区,“\n220欢迎访问Alan的FTP站点\r\n\n”);
//对于(;;)
//写(sockfd,“欢迎”,sizeof(“欢迎”);
//客户端和服务器之间的聊天功能
//printf(“写入sockbuffer后…\n”);
//func(connfd);
int n,字节;
//无限循环聊天
对于(;;)
{
//bzero(buff,MAX);
memset(读缓冲区,0200);
memset(写入缓冲区,0200);
sprintf(write_buffer,“\n220欢迎访问Alan的FTP站点\r\n\n”);
写入(connfd,write_buffer,sizeof(write_buffer));
printf(“进来…\n”);
//从客户端读取消息并将其复制到缓冲区中
而(1)
{
//睡眠(1);
memset(读缓冲区,0200);
memset(写入缓冲区,0200);
//printf(“阅读前…”\n);
字节=读取(connfd,read_buffer,sizeof(read_buffer));
//printf(“是否检查阻塞..%s\n”,读取缓冲区);
如果(字节>0)
{
printf(“来自客户端:%s%d\n”,读取缓冲区,字节);
}
//if(strstrstr(buff,“AUTH TLS”)| | strstr(buff,“AUTH SSL”))
// {
//sprintf(缓冲区,“\n502命令未实现\r\n\n”);
//写入(sockfd,buffer,sizeof(buffer));
// }
if(strstr(读取缓冲区,“用户”))
{
printf(“登录”);
sprintf(写入缓冲区,“需要331密码\r\n”);
字节=写入(connfd,write_buffer,sizeof(write_buffer));
如果(字节<0)中断;
}
if(strncmp(读取缓冲区,“通过”,4)=0)
{
printf(“键入密码(任何操作都可以…\n”);
sprintf(写入缓冲区,“230公共登录成功\r\n”);
字节=写入(connfd,write_buffer,sizeof(write_buffer));
如果(字节<0)中断;
}
如果(strncmp(读缓冲区,“系统”,4)=0)
{
. 2020-09-17 16:03:04.142 Connecting to 192.168.5.37:6000 ...
. 2020-09-17 16:03:19.757 Timeout detected. (data connection)