Aaaah, thank you very much YamiKaitou, that helps me a lot and it works now
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_TCP, OnSocketError);
if (FTP[Sockets][SOCKET_CMD]) SocketConnect(FTP[Sockets][SOCKET_CMD], OnSocketConnected, OnSocketReceive, OnSocketDisconnected, FTP[Server], FTP[Port])
}
public OnSocketError(Handle:socket, const errorType, const errorNum, any:arg)
{
LogError("socket error %d (errno %d)", errorType, errorNum);
CloseHandle(socket);
}
public OnSocketConnected(Handle:socket, any:arg)
{
if (FTP[StartTransfer]) FTP[DataConnected] = true;
}
public OnSocketReceive(Handle:socket, String:receiveData[], const dataSize, any: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_TCP, OnSocketError);
SocketConnect(FTP[Sockets][SOCKET_DATA], OnSocketConnected, OnSocketReceive, OnSocketDisconnected, FTP[DataServer], FTP[DataPort])
FTP[FileHandle] = OpenFile(FTP[LocalFile], "rb");
FTP[FileSizeUpload] = FileSize(FTP[LocalFile]);
if (FTP[Sockets][SOCKET_DATA] != INVALID_HANDLE && FTP[FileHandle] != INVALID_HANDLE) SocketSend(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(CopyReceiver, sizeof(CopyReceiver), receiveData)
SplitString(CopyReceiver, "(", part, sizeof(part))
ReplaceString(CopyReceiver, sizeof(CopyReceiver), part, "")
ReplaceString(CopyReceiver, sizeof(CopyReceiver), ")", "")
ReplaceString(CopyReceiver, sizeof(CopyReceiver), "(", "")
ExplodeString(CopyReceiver, ",", buffers, 6, 9)
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], DataBuffer, BUFFER_SIZE, 1024);
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:socket, any:arg)
{
CloseHandle(socket);
}