Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中的套接字FTP:authentication获取530“;请使用用户登录并通过“登录”;匿名的_C_Sockets_Ftp - Fatal编程技术网

C中的套接字FTP:authentication获取530“;请使用用户登录并通过“登录”;匿名的

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

我正在尝试连接到服务器以下载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命令

这是我的密码:

#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
将解决此问题。