Добавил:
Upload
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:seti_2semestr / Лабораторные работы / ЛР_7 / Samples / UDP / VisualCPP / UDPClient / TFTPClient
.cpp// TFTPClient.cpp : implementation file
//
#include "stdafx.h"
#include "UDPClient.h"
#include "TFTPClient.h"
// CTFTPClient
//-----------------------------------------------
CTFTPClient::CTFTPClient()
{
m_ServerPort=69;
m_State=tftpClear;
}
//-----------------------------------------------
CTFTPClient::~CTFTPClient()
{
}
//-----------------------------------------------
BOOL CTFTPClient::InitInstance(void)
{
BOOL Res=FALSE;
if(Create(0,SOCK_DGRAM))
{
Res=Connect(CString(m_ServerAddress.c_str()),m_ServerPort);
}
return Res;
}
//-----------------------------------------------
int CTFTPClient::ExitInstance(void)
{
return 0;
}
//-----------------------------------------------
void CTFTPClient::SetServer(const string& _Address,UINT _Port)
{
if(m_State==tftpClear)
{
m_ServerAddress=_Address;
m_ServerPort=_Port;
}
else
{
//Нельзя изменять адрес сервера
}
}
//-----------------------------------------------
bool CTFTPClient::GetFile(const string& _RemoteName,const string& _LocalName)
{
char OutBuf[100];
int Offset=0;
//OpCode
OutBuf[0]=0;
OutBuf[1]=1;
Offset+=2;
//Filename
memcpy(OutBuf+Offset,_RemoteName.c_str(),_RemoteName.length()+1);
Offset+=(int)_RemoteName.length()+1;
//Mode
memcpy(OutBuf+Offset,"octet",6);
Offset+=6;
/* //Transfer size
memcpy(OutBuf+Offset,"tsize",6);
Offset+=6;
memcpy(OutBuf+Offset,"0",2);
Offset+=2;
/* //Block size
memcpy(OutBuf+Offset,"blksize",8);
Offset+=8;
memcpy(OutBuf+Offset,"1024",5);
Offset+=5;
//Timeout
memcpy(OutBuf+Offset,"timeout",8);
Offset+=8;
memcpy(OutBuf+Offset,"5",2);
Offset+=2;*/
if(Send(OutBuf,Offset)==Offset)
{
m_State=tftpGetFile;
cout << "##Receive file query sended" << endl;
return true;
}
else
{
cout << "##Couldn't send receive file query. Error code:" << GetLastError() << endl;
return false;
}
}
//-----------------------------------------------
bool CTFTPClient::PutFile(const string& _LocalName,const string& _RemoteName)
{
// WSANOTINITIALISED
return false;
}
//-----------------------------------------------
void CTFTPClient::OnReceive(int nErrorCode)
{
if(m_State==tftpGetFile)
{
char InBuf[10000];
int InLen;
InLen=Receive(InBuf,10000);
if(InLen==SOCKET_ERROR || InLen==0)
{
cout << "##Error while receive" << endl;
}
else
{
cout << "##Received packet" << endl;
int OpCode=InBuf[1];
if(OpCode==5)//Error
{
int ErrCode=*((__int16*)InBuf+1);
cout << "Error " << ErrCode << ": " << InBuf+4 << endl;
}
else if(OpCode==3)//Data
{
}
}
}
else if(m_State==tftpPutFile)
{
}
else
{
cout << "##Unexpected data from server" << endl;
}
}
//-----------------------------------------------
Соседние файлы в папке UDPClient