gpt4 book ai didi

c - C : authentication gets 530 "Please login with user and pass" with anonymous 中的套接字 FTP

转载 作者:太空宇宙 更新时间:2023-11-04 02:46:43 25 4
gpt4 key购买 nike

我正在尝试连接到服务器以下载 POS(销售点)应用程序。目前,我正在努力使PC 上的工作适应POS。 (POS 没有 FTP API,只有套接字)

正在尝试连接到 ftp://ftp.inf.puc-rio.br/ (139.82.16.194)。我也试过 ftp.dca.fee.unicamp.br 结果相同。

我正在使用 sys/socket.h。我明白了:

220 Bem Vindo ao Servidor do DI / PUC-Rio.

USER anonymous

Response: 331 Please specify the password.

PASS 123

Response: 530 Please login with USER and PASS

我尝试了其他密码,例如 email、guest 但没有成功。在 Filezilla 中,我使用相同的值(IP、用户、密码 123 和端口 21),我得到了这个:

USER anonymous

Response: 331 Please specify the password.

Comando: PASS ***

Response: 230 Login successful.

试图理解为什么服务器不接受 PASS 命令。

这是我的代码:

#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);
}

代码没有下载任何东西。我正在尝试首先验证。一些包含和变量没有使用,因为属于 FTP 应用程序的示例,有其余代码要下载。

FTP Authentication

谢谢大家!

最佳答案

代码最核心的问题是赋予write() 的长度来自sizeof。如果将这些更改为对 strlen() 的调用,则匿名登录有效。使用 sizeof 作为长度向服务器发送 256 个字节。

至少我用 (vsftpd) 尝试过的一个 ftp 服务器,否则不喜欢密码。我没有检查 RFC 以查看是否是长度或零导致冲突。对于开发,您可能还想在本地安装一些 ftpd 软件。我认为针对您自己运行的服务器进行试验可能更为谨慎。

NIT:我不知道你在哪个系统上编译代码,但在 Linux/Posix 系统上它需要更多的包含。我加了

#include <string.h> 
#include <stdlib.h>
#include <unistd.h>

我建议您使用 clang 编译器进行编译,或者将标志 -Wall -Werror -Wextra 用于 gcc。

我还建议使用 strerror() 或类似的方法,而不是在出现问题时仅打印 errno。

关于c - C : authentication gets 530 "Please login with user and pass" with anonymous 中的套接字 FTP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26592259/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com