FTP RFC 959 Problem (ftp Client C linux)
-
Soweit ich das RFC richtig gelesen hab, müsste ich alles richtig gemacht haben. Doch das Problem ist, der ftp server antwortet nicht auf mein LIST. Ich habs mit telnet erfolgreich durchprobiert. Also, ich habe zwei sockets, einer, der die Befehle beantragt und ein anderer für daten. Doch ich krieg von LIST nix zurück...
der Debugger hilft mir hier auch nix. Ganz einfach, recv kriegt 0 zurück. Also keine nachricht angekommen, nach ner bestimmten Zeit connection close. Hier mein source. In irc's habe ich auch schon rumgefragt, die waren recht ratlos.#include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <arpa/inet.h> #include <unistd.h> #define PORT 21 #define RCVBUFSIZE 8192 #define SERVER "ftp.linuss.li.ohost.de" #define PASS "PASS negeropfer\r\n" #define USER "USER linuss\r\n" static void err0r(char *Message); static int initsock(char *IP, int Port, struct sockaddr_in server, struct hostent *host_info); static int initsock(char *IP, int Port, struct sockaddr_in server, struct hostent *host_info) { int sock; unsigned long addr; sock = socket( AF_INET, SOCK_STREAM, 0 ); if ( sock < 0) err0r("Fehler bei socket()"); memset( &server, 0, sizeof (server)); if ((addr = inet_addr( IP )) != INADDR_NONE) { memcpy( (char *)&server.sin_addr, &addr, sizeof(addr)); } else { host_info = gethostbyname(IP); if (NULL == host_info) err0r("Unkn0wn server"); memcpy( (char *)&server.sin_addr, host_info->h_addr, host_info->h_length ); } server.sin_family = AF_INET; server.sin_port = htons( Port ); if(connect(sock,(struct sockaddr*)&server,sizeof(server)) < 0) err0r("Mehr bytes versendet, als erwartet"); return sock; } static void err0r(char *Message) { fprintf(stderr, "%s: %s\n", Message, strerror(errno)); exit(EXIT_FAILURE); } int main() { int portergebnis; int multiplikator; int additor; int length; int len; int sockconnect; int sockpasv; char *receive; char *request; char *receivepointer; char *p; //pointer für memchr char Pass[] = PASS; char User[] = USER; char syst[10] = "SYST\r\n"; char feat[10] = "FEAT\r\n"; char pwd[10] = "PWD\r\n"; char type[10] = "TYPE I\r\n"; char pasv[10] = "PASV\r\n"; char list[10] = "LIST\r\n"; char suchstring[] = "331"; char IP[13]; char IP2[13]; size_t recvsize; struct sockaddr_in server1; struct hostent *host_info1; struct sockaddr_in server2; struct hostent *host_info2; request = (char *)malloc(500); receive = (char *)malloc(500); memset(request, 0, 500); memset(receive, 0, 500); sockconnect = initsock(SERVER, PORT, server1, host_info1); //USER length = 500; strcpy(request,User); len = strlen(request); if (send(sockconnect, request, len, 0) != len) err0r("Mehr bytes versendet, als erwartet"); recvsize = recv(sockconnect,receive,length,0); printf("1\n%s\n\n",receive); memset(receive, 0, recvsize); memset(request, 0, 500); //PASS strcpy(request,Pass); len = strlen(request); while(strstr(receive, suchstring) == NULL) { if (send(sockconnect, request, len, 0) != len) err0r("Mehr bytes versendet, als erwartet"); recvsize = recv(sockconnect,receive,length,0); } printf("2\n%s\n\n",receive); memset(receive, 0, recvsize); recvsize = recv(sockconnect,receive,length,0); printf("3\n%s\n\n",receive); memset(receive, 0, recvsize); memset(request, 0, 500); //syst strcpy(request,syst); len = strlen(request); if (send(sockconnect, request, len, 0) != len) err0r("Mehr bytes versendet, als erwartet"); recvsize = recv(sockconnect,receive,length,0); printf("4\n%s\n\n",receive); memset(receive, 0, recvsize); memset(request, 0, 500); //feat strcpy(request,feat); len = strlen(request); if (send(sockconnect, request, len, 0) != len) err0r("Mehr bytes versendet, als erwartet"); recvsize = recv(sockconnect,receive,length,0); printf("5\n%s\n\n",receive); memset(receive, 0, recvsize); memset(request, 0, 500); //pwd strcpy(request,pwd); len = strlen(request); if (send(sockconnect, request, len, 0) != len) err0r("Mehr bytes versendet, als erwartet"); recvsize = recv(sockconnect,receive,length,0); printf("6\n%s\n\n",receive); memset(receive, 0, recvsize); memset(request, 0, 500); //type strcpy(request,type); len = strlen(request); if (send(sockconnect, request, len, 0) != len) err0r("Mehr bytes versendet, als erwartet"); recvsize = recv(sockconnect,receive,length,0); printf("7\n%s\n\n",receive); memset(receive, 0, recvsize); memset(request, 0, 500); //pasv strcpy(request,pasv); len = strlen(request); if (send(sockconnect, request, len, 0) != len) err0r("Mehr bytes versendet, als erwartet"); recvsize = recv(sockconnect,receive,length,0); printf("8\n%s\n\n",receive); //Passive Mode Convert receivepointer = receive; receivepointer += 26; printf("%s\n\n",receivepointer); /* Eine komplizierte Stelle, fucking Passive mode. Thx an der Stelle bl0b <bl0b> die 1. 4 zahlen sind die ip <bl0b> 102*255 + 91 = port (grrr, fast richtig, 102*256+91, und ich such ewig nach dem fehler) (213,202,225,41,102,91) */ memset(IP, 0, 12); p = (char *) memchr(receivepointer, ',', 4); printf("gefunden an Pos. %d\n", p-receivepointer); memcpy(IP, receivepointer, p-receivepointer); strncat(IP, ".", 1); printf("%s\n",IP); receivepointer += ((p-receivepointer)+1); p = (char *) memchr(receivepointer, ',', 4); memcpy(IP2, receivepointer, p-receivepointer); strncat(IP2, ".", 1); printf("%s\n",IP2); strcat(IP, IP2); printf("Kombiniert: %s\n",IP); receivepointer += ((p-receivepointer)+1); p = (char *) memchr(receivepointer, ',', 4); memset(IP2, 0, 12); memcpy(IP2, receivepointer, p-receivepointer); strncat(IP2, ".", 1); strcat(IP, IP2); printf("Kombiniert: %s\n",IP); receivepointer += ((p-receivepointer)+1); p = (char *) memchr(receivepointer, ',', 4); memset(IP2, 0, 12); memcpy(IP2, receivepointer, p-receivepointer); strcat(IP, IP2); printf("Kombiniert: %s\n",IP); //Multiplikator receivepointer += ((p-receivepointer)+1); p = (char *) memchr(receivepointer, ',', 4); memset(IP2, 0, 12); memcpy(IP2, receivepointer, p-receivepointer); printf("Kombiniert: %s\n",IP2); multiplikator = atoi(IP2); printf("shit nigga: %d\n",multiplikator); //Additor receivepointer += ((p-receivepointer)+1); printf("%s\n",receivepointer); p = (char *) memchr(receivepointer, ')', 4); if(NULL == p) printf("memchr nicht erfolgreich\n"); memset(IP2, 0, 12); memcpy(IP2, receivepointer, p-receivepointer); printf("Kombiniert: %s\n",IP2); additor = atoi(IP2); printf("shit nigga: %d\n",additor); memset(receive, 0, recvsize); memset(request, 0, 500); //Portergebnis portergebnis = ((multiplikator*256) + additor); printf("%d*256+%d= %d\n",multiplikator, additor, portergebnis); //Socket für Passive Mode printf("Connecting to %s:%d\n", IP, portergebnis); sockpasv = initsock(IP, portergebnis, server2, host_info2); printf("Connected\n"); //list strcpy(request,list); len = strlen(request); if (send(sockconnect, request, len, 0) != len) err0r("Mehr bytes versendet, als erwartet"); printf("jetzt recv\n"); recvsize = recv(sockconnect,receive,length,0);//150 Opening ASCII mode data connection for file list\r\n226 Transfer complete empfangen printf("9\n%d\n\n",recvsize); memset(receive, 0, recvsize); recvsize = recv(sockpasv,receive,length,0);//Ordnerstruktur empfangen... printf("9\n%s\n\n",receive); memset(receive, 0, recvsize); memset(request, 0, 500); free(request); free(receive); close(sockconnect); close(sockpasv); return EXIT_SUCCESS; }
Ich weiß, dass es nicht perfekt programmiert ist und man Prozesse, wie die ftp Befehle senden besser mit ner funktion löst, aber es geht in erster Linie um die Funktion des Programms. Die Optimierung des Quelltextes/geschwindigkeit des programms kommt noch.
-
Optimieren kommt noch? Wann? Es ist keine gute Idee, 200-zeilige Funktionen zu schreiben, die liest sich nämlich niemand gerne durch. Zeig uns ein Minimalbeispiel, das Dein Problem illustriert, dann ist die Wahrscheinlichkeit, dass Dir geholfen wird, wesentlich höher.