gpt4 book ai didi

c - 在 C 中使用套接字将文件发送到 ftp 服务器

转载 作者:太空宇宙 更新时间:2023-11-04 00:48:09 27 4
gpt4 key购买 nike

我正在尝试使用套接字将文件上传到我的 ftp 服务器。它连接到服务器并可以读取目录但不上传文件。 “STOR”命令在服务器中创建一个内容为空的文件。为什么我从服务器收到“无数据连接”响应,而我的文件是空的?

#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <arpa/inet.h>

int main(int argc, char *argv[])
{
argv[0]="2";
argv[1]="ip";

int sockfd = 0, n = 0;
char recvBuff[1024];
struct sockaddr_in serv_addr;
char mesUser[100]="USER ftpuser\n";
char mesPass[100]="PASS pass\n";
char meStor[100]="STOR xx\n";
char mesPasv[100]="PASV\n";
char meAppe[100]="APPE xx\n";

argc=2;

if(argc != 2)
{
printf("\n Usage: %s <ip of server> \n",argv[0]);
return 1;
}

memset(recvBuff, '0',sizeof(recvBuff));
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
printf("\n Error : Could not create socket \n");
return 1;
}

memset(&serv_addr, '0', sizeof(serv_addr));

serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(21);

if(inet_pton(AF_INET, argv[1], &serv_addr.sin_addr)<=0)
{
printf("\n inet_pton error occured\n");
return 1;
}


//serv_addr.sin_addr.s_addr = inet_addr(argv[1]);

if( connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
{
printf("\n Error : Connect Failed \n");
return 1;
}

if( send(sockfd , mesUser , strlen(mesUser) , 0) < 0)
{
perror("send failed");
return 1;
}

if( send(sockfd , mesPass , strlen(mesPass) , 0) < 0)
{
perror("send failed");
return 1;
}

char* fr_name = "pic.jpg";
FILE *fr = fopen(fr_name, "r");
if(fr == NULL){
printf("File cannot be opened");
return 0;
}
else{

/*if( send(sockfd , mesPasv , strlen(mesPasv) , 0) < 0)
{
perror("send failed");
return 1;
}*/

if( send(sockfd , meStor , strlen(meStor) , 0) < 0)
{
perror("send failed");
return 1;
}



char buffer[100];
fscanf(fr,"%s",buffer);
write(sockfd,buffer,100);


if( send(sockfd , meAppe , strlen(meAppe) , 0) < 0)
{
perror("send failed");
return 1;
}
//close(sockfd);


}

/*if( send(sockfd , meStor , strlen(meStor) , 0) < 0)
{
perror("send failed");
return 1;
}
*/

while ( (n = read(sockfd, recvBuff, sizeof(recvBuff)-1)) > 0)
{
recvBuff[n] = 0;
if(fputs(recvBuff, stdout) == EOF)
{
printf("\n Error : Fputs error\n");
return 0;
}
}

if(n < 0)
{
printf("\n Read error \n");
return 0;
}

return 0;
}

输出:

 220---------- Welcome to Pure-FTPd [privsep] [TLS] ----------
220-You are user number 6 of 50 allowed.
220-Local time is now 14:41. Server port: 21.
220 You will be disconnected after 15 minutes of inactivity.
331 User username OK. Password required
230 OK. Current restricted directory is /
425 No data connection
425 No data connection

最佳答案

看来你对FTP协议(protocol)的理解还不够全面。 FTP 的工作原理是在客户端和服务器之间有 2 个套接字连接。第一个是“控制”连接,第二个是“数据”连接。在控制连接上,文本命令来回发送,就像您在代码中所做的那样。当需要来回发送数据时,使用数据连接来完成。

FTP建立数据连接有两种方式,described here :

  • 事件:客户端指定一个端口到服务器,服务器连接到客户端机器上的那个端口。这很糟糕,因为防火墙和 NAT 旨在避免此类连接。
  • 被动:服务器为客户端提供一个连接端口,客户端连接到服务器计算机上的该端口。

简而言之,您需要:

  1. 使用 PASV 命令。
  2. 解析服务器的响应以获取端口号(可能使用scanf)。
  3. 打开到服务器上该端口的数据连接。
  4. 将您的文件通过该数据连接。

自从我上次用 C 编写套接字以来已经有一段时间了,我没有时间编写示例,但这应该足以让您入门。 (Here 是 FTP 的规范。像这样的 RFC 阅读量很大,但它们是明确的,可以回答很多问题,如果你能学会阅读它们的话。)

关于c - 在 C 中使用套接字将文件发送到 ftp 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29391259/

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