FTP-Upload - Ohne library request



  • Hi,
    Ich wollte mal selbst via WinSocket ein ftp-upload Programm schreiben, jedoch verstehe ich das empfangen der informationen nicht ganz.

    #pragma comment(lib,"WS2_32.lib")
    #include <iostream>
    #include <winsock2.h>
    
    bool Receive(SOCKET sock)
    {
    	char buffer[1024];
    	int bytes;
    	bytes = recv(sock,buffer,sizeof(buffer) - 1,0);
    	if(bytes == -1)
    	{
    		printf("Failed at recv()\n");
    		return false;
    	}
    	buffer[bytes] = '\0';
    	printf("Server: %s\n\n",buffer);
    	return true;
    }
    bool Send(SOCKET sock,std::string request)
    {
    	char buffer[1024];
    	int bytes;
    	bytes = send(sock,request.c_str(),request.size(),0);
    	if(bytes == -1)
    	{
    		printf("Failed at send!\n");
    		return false;
    	}
    	return true;
    }
    int FtpUpload(std::string address,char* filename)
    {
    	WSADATA w;
    	if(int result = WSAStartup(MAKEWORD(2,2),&w) != 0)
    	{
    		return 1;
    	}
    	hostent* phe = gethostbyname(address.c_str());
    	int Socket = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
    	if((phe == NULL) || (phe->h_addrtype != AF_INET) || (phe->h_length != 4) || (Socket == -1))
    	{
    		return 1;
    	}
    	sockaddr_in service;
    	service.sin_family = AF_INET;
    	service.sin_port = htons(21);
    	char** p = phe->h_addr_list;
    	int result;
    	do
    	{
    		if(*p == NULL)
    		{
    			return 1;
    		}
    		service.sin_addr.s_addr = *reinterpret_cast<unsigned long*>(*p);
    		++p;
    		result = connect(Socket,reinterpret_cast<sockaddr*>(&service),sizeof(service));
    	}while(result == -1);
    	printf("connected\n");
    	Receive(Socket);
    
    	std::string request = "USER XXX PASS XXX";
    	Send(Socket,request.c_str());
    
    	Receive(Socket);
    
    	printf("Done!\n");
    	closesocket(Socket);
    	WSACleanup();
    }
    int main(int argc,char* argv)
    {
    	FtpUpload("192.168.2.129","test.txt");
    	system("pause >nul");
    }
    

    jedoch antwortet der server nur 1 mal.
    Ich erhalte folgenden Output:
    connected
    Server: 220 (hier server infos)

    Done!

    Ich habe im Internet kein Tutorial gefunden für FTP-Socket Programmierung nur verweise auf fertige Libs.



  • Hallo, lad dir mal Wireshark runter und schau z.b. was genau passiert wenn du dich an dem Server anmeldest und eine Datei hochlädst.

    Mit Hilfe von Wireshark konnte ich meinen eigenen E-Mail Client schreiben.

    Da musste ich die strings immer mit \n abschliessen ka ob das bei FTP auch so ist aber ich denke mal ja.

    string send_mail ="From: <example@example.de>\n";
           send_mail+="To: <example@example.de>\n";
           send_mail+="Subject: hallo ich bin der betreff\n";
           send_mail+="Date: We, 9 Jun 2010 12:10:00\n";
    
           send_mail+="Text Zeile 1 der email \n";
    
           send_mail+="\n"; // Zeilenumbruch in der E-Mail
    
           send_mail+="Text Zeile 2 der email\n";
           send_mail+=".\n";
    

    Wireshark Download Link: http://www.wireshark.org/download.html


Anmelden zum Antworten