C中的套接字FTP:authentication获取530“;请使用用户登录并通过“登录”;匿名的
我正在尝试连接到服务器以下载POS(销售点)应用程序。目前,我正在尝试在PC上工作以适应POS(POS没有FTP API,只有套接字) 正在尝试连接到(139.82.16.194)。我还尝试了ftp.dca.fee.unicamp.br,结果也一样 我正在使用sys/socket.h。我明白了: 220 Bem Vindo ao Servidor do DI/PUC Rio 用户匿名 回复:331请指定密码 pass123 回复:530请使用用户登录并通过 我尝试了另一种方式,比如email,guest,但没有成功。 在Filezilla中,我使用相同的值(IP、用户、密码123和端口21),我得到以下结果: 匿名用户 回复:331请指定密码 科曼多:通过*** 响应:230登录成功 试图理解服务器为什么不接受PASS命令 这是我的密码:C中的套接字FTP:authentication获取530“;请使用用户登录并通过“登录”;匿名的,c,sockets,ftp,C,Sockets,Ftp,我正在尝试连接到服务器以下载POS(销售点)应用程序。目前,我正在尝试在PC上工作以适应POS(POS没有FTP API,只有套接字) 正在尝试连接到(139.82.16.194)。我还尝试了ftp.dca.fee.unicamp.br,结果也一样 我正在使用sys/socket.h。我明白了: 220 Bem Vindo ao Servidor do DI/PUC Rio 用户匿名 回复:331请指定密码 pass123 回复:530请使用用户登录并通过 我尝试了另一种方式,比如email,g
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <time.h>
#include <errno.h>
#define SERVER_PORT_ID 21
#define CLIENT_PORT_ID 8015
#define SERVER_HOST_ADDR "139.82.16.194"
/* ftp.dca.fee.unicamp.br */
//ftp://ftp.inf.puc-rio.br/
#define MAXSIZE 256
main(int argc,char *argv[]){
int sockid, newsockid,i,getfile,ack,msg,msg_2,c,len;
int no_writen,start_xfer, num_blks,num_last_blk;
struct sockaddr_in my_addr, server_addr;
FILE *fp;
char in_buf[MAXSIZE], buffer[MAXSIZE];
if ((sockid = socket(AF_INET,SOCK_STREAM,0)) < 0)
{
printf("client: socket error : %d\n", errno); exit(0);
}
printf("client: binding my local socket\n");
bzero((char *) &my_addr,sizeof(my_addr));
my_addr.sin_family = AF_INET;
my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
my_addr.sin_port = htons(CLIENT_PORT_ID);
if (bind(sockid ,(struct sockaddr *) &my_addr,sizeof(my_addr)) < 0)
{
printf("client: bind error :%d\n", errno); exit(0);
}
setsockopt(sockid,SOL_SOCKET, SO_KEEPALIVE, 0, MAXSIZE);
//Try to connect
printf("client: starting connect\n");
bzero((char *) &server_addr,sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr(SERVER_HOST_ADDR);
server_addr.sin_port = htons(SERVER_PORT_ID);
if (connect(sockid ,(struct sockaddr *) &server_addr,
sizeof(server_addr)) < 0)
{
printf("client: connect error :%d\n", errno); exit(0);
}
//Print the Welcome message
do{
memset((void*) buffer,0,MAXSIZE);
if(read(sockid,buffer,MAXSIZE) < 0)
{
printf("client: read error :%d\n", errno); exit(0);
}
printf("%s \n", buffer);
}while(strstr(buffer,"220 ") == NULL);
printf("Mensagem Welcome recebida\n");
//Try to connect
stpcpy(buffer,"USER anonymous\r\n");
printf("%s", buffer);
if(write(sockid,buffer,sizeof(buffer))< 0){
printf("client: write error :%d\n", errno); exit(0);
}
if(read(sockid,buffer,MAXSIZE) < 0)
{
printf("client: read error :%d\n", errno); exit(0);
}
printf("%s", buffer);
memset((void*) buffer,0,MAXSIZE);
stpcpy(buffer,"PASS 123\r\n");
printf("%s", buffer);
if(write(sockid,buffer,sizeof(buffer))< 0){
printf("client: write error :%d\n", errno); exit(0);
}
memset((void*) buffer,0,MAXSIZE);
if(read(sockid,buffer,MAXSIZE) < 0)
{
printf("client: read error :%d\n", errno); exit(0);
}
printf("%s \n", buffer);
exit(0);
}
#包括
#包括
#包括
#包括
#包括
谢谢大家 代码最核心的问题是write()
的长度来自sizeof
。如果将这些更改为调用strlen()
,则匿名登录有效。使用长度为的sizeof
将256字节发送到服务器
至少有一台ftp服务器(vsftpd)不喜欢密码。我没有检查RFC,看是长度还是零导致冲突。对于开发,您可能还希望在本地安装一些ftpd软件。我认为对自己运行的服务器进行实验可能更为谨慎
妮特:我不知道你在什么系统上编译代码,但是在Linux/Posix系统上,它需要更多的包含。我补充说
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#包括
#包括
#包括
我建议您使用clang编译器进行编译,或者使用flags-Wall-Werror-Wextra-to-gcc
我还建议在出现故障时使用strerror()
或类似方法,而不是仅打印错误号。我不知道C,但看起来您发送的是一个空的PASS
请求。请提供编译的示例代码。该代码缺少一系列包含项。另外,您没有在bind()
之前调用socket()
,因此无法访问登录名。bind
和connect
都会失败。对不起,伙计们。代码现在是正确的@AndrewLambert我输入了一个密码,但仍然是相同的结果匿名登录的常用密码是电子邮件地址。你确定这适用于现有的FTP客户端吗?使用数据包嗅探器查看FileZilla真正发送的是什么,然后在代码中复制它。是的,strlen()在write中解决了这个问题。我认为这个参数是以字节为单位的,所以我使用了sizeof。谢谢我也很欣赏其他技巧。参数确实是字节数,但sizeof
给出了整个缓冲区的大小,而strlen()
计算“\0”(null)字符前文本的“字符数”,即字节数。当您只将有意义的数据放入整个缓冲区的一小部分时,给出整个缓冲区的大小是不必要的,而且似乎不起作用。如果你喜欢这个答案,请通过投票或接受答案来确认。我知道了。再次感谢。我已经接受了答案。但我不能投票。(名誉)的确strlen
将解决此问题。