Thread: FTP Upload
View Single Post
dordnung
Veteran Member
Join Date: Apr 2010
Old 12-15-2010 , 13:42   Re: FTP Upload
Reply With Quote #18

Aaaah, thank you very much YamiKaitou, that helps me a lot and it works now

Here is the final code:

PHP Code:
#include <sourcemod>
#include <socket>

#define BUFFER_SIZE 1024

enum SocketTypes
{
    
Handle:SOCKET_CMD,
    
Handle:SOCKET_DATA
}

enum FTPInfo
{
    
Sockets[SocketType],
    
String:Server[40],
    
Port,
    
String:UserName[32],
    
String:Password[32],
    
String:LocalFile[64],
    
String:RemoteFile[64],
    
String:DataServer[16],
    
String:RemoteFilePath[256],
    
DataPort,
    
bool:ReadyForData,
    
bool:StartTransfer,
    
bool:DataConnected,
    
BytesTransferred,
    
Handle:FileHandle,
    
FileSizeUpload
}

new 
FTP[FTPInfo];
new 
String:DataBuffer[BUFFER_SIZE]

public 
FileTransfer(const String:szServer[], const iPort, const String:szUser[], const String:szPassword[], const String:szLocalFile[], const String:szRemoteFile[])
{
    
Format(FTP[Server], sizeof(FTP[Server]), szServer );
    
FTP[Port] = iPort;
    
Format(FTP[UserName], sizeof(FTP[UserName]), "USER %s\r\n"szUser);
    
Format(FTP[Password], sizeof(FTP[Password]), "PASS %s\r\n"szPassword);
    
Format(FTP[LocalFile], sizeof(FTP[LocalFile]), szLocalFile);
    
Format(FTP[RemoteFile], sizeof(FTP[RemoteFile]), szRemoteFile);
    
Format(FTP[RemoteFilePath], sizeof(FTP[RemoteFilePath]), "STOR %s\r\n"szRemoteFile);

    
FTP[FileSizeUpload] = 0;
    
FTP[ReadyForData] = false;
    
FTP[StartTransfer] = false;
    
FTP[DataConnected] = false;

    
FTP[Sockets][SOCKET_CMD] = SocketCreate(SOCKET_TCPOnSocketError);
    
    if (
FTP[Sockets][SOCKET_CMD]) SocketConnect(FTP[Sockets][SOCKET_CMD], OnSocketConnectedOnSocketReceiveOnSocketDisconnectedFTP[Server], FTP[Port])
}

public 
OnSocketError(Handle:socket, const errorType, const errorNumany:arg
{
    
LogError("socket error %d (errno %d)"errorTypeerrorNum);
    
CloseHandle(socket);
}

public 
OnSocketConnected(Handle:socketany:arg
{
    if (
FTP[StartTransfer]) FTP[DataConnected] = true;
}

public 
OnSocketReceive(Handle:socketString:receiveData[], const dataSizeany:arg
{
    
PrintToServer(receiveData);
    if (!
StrContains(receiveData"331"))
    {
        
SocketSend(FTP[Sockets][SOCKET_CMD], FTP[Password]);
    }
    if (!
StrContains(receiveData"220"))
    {
        
SocketSend(FTP[Sockets][SOCKET_CMD], FTP[UserName]);
    }
    else if (!
StrContains(receiveData"230"))
    {
        
SocketSend(FTP[Sockets][SOCKET_CMD], "PASV\r\n");
    }
    else if (!
StrContains(receiveData"200"))
    {
        if (!
FTP[ReadyForData])
        {
            
SocketSend(FTP[Sockets][SOCKET_CMD] , "MODE S\r\n");
            
FTP[ReadyForData] = true;
        }
        else
        {
            
FTP[StartTransfer] = true;
            
FTP[Sockets][SOCKET_DATA] = SocketCreate(SOCKET_TCPOnSocketError);
            
SocketConnect(FTP[Sockets][SOCKET_DATA], OnSocketConnectedOnSocketReceiveOnSocketDisconnectedFTP[DataServer], FTP[DataPort])
            
FTP[FileHandle] = OpenFile(FTP[LocalFile], "rb");
            
FTP[FileSizeUpload] = FileSize(FTP[LocalFile]);

            if (
FTP[Sockets][SOCKET_DATA] != INVALID_HANDLE && FTP[FileHandle] != INVALID_HANDLESocketSend(FTP[Sockets][SOCKET_CMD], FTP[RemoteFilePath]);
        }
    }
    else if (!
StrContains(receiveData"227")) 
    {
        
decl String:buffers[6][10];
        
decl String:CopyReceiver[512];
        
decl String:part[128];
        
        
Format(CopyReceiversizeof(CopyReceiver), receiveData)
        
        
SplitString(CopyReceiver"("partsizeof(part))
        
ReplaceString(CopyReceiversizeof(CopyReceiver), part"")
        
ReplaceString(CopyReceiversizeof(CopyReceiver), ")""")
        
ReplaceString(CopyReceiversizeof(CopyReceiver), "(""")
        
ExplodeString(CopyReceiver","buffers69)
        
Format(FTP[DataServer], sizeof(FTP[DataServer]), "%s.%s.%s.%s"buffers[0], buffers[1], buffers[2], buffers[3]);
        
FTP[DataPort] = (StringToInt(buffers[4]) * 256 ) + StringToInt(buffers[5])
        
        
SocketSend(FTP[Sockets][SOCKET_CMD], "TYPE I\r\n");
    }
}

public 
OnGameFrame()
{
    if (
FTP[DataConnected])
    {
        new 
iBlocksRead;
        
iBlocksRead ReadFileString(FTP[FileHandle], DataBufferBUFFER_SIZE1024);
        
SocketSend(FTP[Sockets][SOCKET_DATA], DataBuffer);        
        
        
FTP[BytesTransferred] += iBlocksRead;
        
        if (
FTP[FileSizeUpload] && (FTP[BytesTransferred] == FTP[FileSizeUpload]))
        {
            
CloseHandle(FTP[FileHandle]);

            
SocketSend(FTP[Sockets][SOCKET_CMD], "QUIT\r\n");

            
CloseHandle(FTP[Sockets][SOCKET_DATA]);
            
CloseHandle(FTP[Sockets][SOCKET_CMD]);
            
            
FTP[StartTransfer] = false;
            
FTP[DataConnected] = false;
        }
    }
}

public 
OnSocketDisconnected(Handle:socketany:arg
{
    
CloseHandle(socket);

__________________
dordnung is offline