Datei senden an ftp-server mit sockets in C
Ich versuche, eine Datei hochzuladen auf mein ftp-server mit sockets. Es verbindet sich mit dem server und liest die Verzeichnisse, aber nicht die Datei hochladen. "STOR" - Befehl erstellt eine Datei in dem server mit einem leeren Inhalt. Warum bin ich immer "Keine Datenverbindung" - Antwort vom server und meine Datei ist leer?
#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;
}
Ausgabe:
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
- Senden Sie das
APPE
Befehl Anhängen, um eine Datei auf der server-Seite, aber Sie machen Sie nicht eine Daten-Verbindung zum senden der aktuellen Datei und weder zu initiieren aktiv-Modus Daten übertragen. Was erwartest du, was passiert? - Außerdem müssen Sie nicht befolgen Sie die Protokoll-Spezifikation, die von request-response-Typ. Senden Sie eine Anfrage (Befehl), und der server antwortet mit einer Antwort. Sie senden alle Ihrem Befehl ohne zu wissen, ob der server Sie akzeptiert oder nicht, dann am Ende Sie alle Lesen, dass die übertragenen Daten vom server, um Sie am Ende. Sie müssen Lesen Sie mehr über FTP, einschließlich Ihrer entsprechenden RFC-Dokumenten.
- Wie kann ich eine Daten-Verbindung zu senden Sie die Datei über sockets? Können Sie mir sagen, welche Funktionen ich verwenden soll, oder empfehlen Sie mir eine Quelle oder ein Beispiel zeigen? Ich bin neu in C.
- FYI, Ihre
memset()
Funktionen nicht null Ihre Puffer aus, sondern füllen Sie mit der ASCII-Darstellung der'0'
, d.h. 0x30. Besser ersetzen Sie es mit0
. - In der Tat brauchen Sie nicht
memset()
fordert auf, alles in korrekt geschriebenen Netzwerk-code, ein anderer als null-Adress-Strukturen vorbind()
oderconnect().
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sieht es aus wie Sie haben ein unvollständiges Verständnis des FTP-Protokolls. FTP arbeitet auf der Idee der 2-socket-verbindungen zwischen client und server. Die erste ist eine "control" - Anschluss, und die zweite ist eine "Datenverbindung". Auf die control-Verbindung, text-Befehle gesendet werden, hin und her, wie Sie tun in Ihrem code. Wenn Daten hin und her gesendet, es erfolgt über die Daten-Verbindung.
Gibt es zwei Möglichkeiten für FTP einrichten einer Datenverbindung, hier beschrieben:
In kurzen, müssen Sie Folgendes tun:
PASV
Befehl.scanf
).Es ist schon eine Weile her, seit ich das Letzte mal geschrieben mit sockets in C, und ich habe nicht die Zeit, um zu schreiben ein Beispiel, aber dies sollte genug sein, zum du zu erhalten begannen. (Hier ist die Spezifikation für FTP. RFC ' s wie diese sind schwer zu Lesen, aber Sie sind eindeutig und beantworten eine Menge Fragen, wenn Sie lernen, Sie zu Lesen.)
ich hoffe, dies wird für Sie nützlich sein :
}
}