Change project from listener to sstp
This commit is contained in:
118
sstp/clientsocketsender.cpp
Normal file
118
sstp/clientsocketsender.cpp
Normal file
@@ -0,0 +1,118 @@
|
||||
#include <sstp/clientsocketsender.hpp>
|
||||
|
||||
ClientSocketSender::ClientSocketSender(String ipAddress, int port)
|
||||
: mIPAddress(ipAddress), mPort(port)
|
||||
{
|
||||
mSocket = ::socket(AF_INET,SOCK_STREAM,0);
|
||||
if(!isOkay())
|
||||
{
|
||||
std::cout << "Unable to initialize socket " << std::endl;
|
||||
return;
|
||||
}
|
||||
mInternalSocketAddress.sin_family = AF_INET;
|
||||
mInternalSocketAddress.sin_port= ::htons(mPort);
|
||||
int result = ::inet_pton(AF_INET, ipAddress.str(), &mInternalSocketAddress.sin_addr);
|
||||
if(result<0)
|
||||
{
|
||||
std::cout << "Unable to convert ipaddress to network address" << std::endl;
|
||||
close();
|
||||
return;
|
||||
}
|
||||
result = ::connect(mSocket, (struct sockaddr*)&mInternalSocketAddress, sizeof(mInternalSocketAddress));
|
||||
if(result<0)
|
||||
{
|
||||
close();
|
||||
std::cout << "Unable to connect to host " << mIPAddress << ":" << mPort << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
ClientSocketSender::~ClientSocketSender()
|
||||
{
|
||||
close();
|
||||
}
|
||||
|
||||
void ClientSocketSender::close(void)
|
||||
{
|
||||
if(-1!=mSocket)
|
||||
{
|
||||
::close(mSocket);
|
||||
mSocket=-1;
|
||||
}
|
||||
}
|
||||
|
||||
bool ClientSocketSender::sendFile(String &pathFileName)
|
||||
{
|
||||
Profiler profiler;
|
||||
FileIO readFile(pathFileName, FileIO::ByteOrder::LittleEndian, FileIO::Mode::ReadOnly, FileIO::CreationFlags::None);
|
||||
if(!readFile.isOkay())
|
||||
{
|
||||
std::cout << "File open failed " << pathFileName << std::endl;
|
||||
return false;
|
||||
}
|
||||
readFile.setBufferLength(BUFFER_LENGTH);
|
||||
DWORD fileLength = readFile.size();
|
||||
sendPutIndicator(pathFileName, fileLength);
|
||||
Array<char> readBuffer;
|
||||
readBuffer.size(BUFFER_LENGTH);
|
||||
while(true)
|
||||
{
|
||||
size_t bytesRead = readFile.read(&readBuffer[0], readBuffer.size());
|
||||
if(0==bytesRead)
|
||||
{
|
||||
std::cout << "No data was read from the file" << std::endl;
|
||||
break;
|
||||
}
|
||||
sendPacketIndicator(bytesRead);
|
||||
sendPacket(readBuffer, bytesRead);
|
||||
if(bytesRead<readBuffer.size())break;
|
||||
}
|
||||
sendPacketIndicator(0);
|
||||
sendQuit();
|
||||
readFile.close();
|
||||
std::cout << "SendFile done, total took " << profiler.end() << "(ms)" << std::endl;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ClientSocketSender::sendPacketIndicator(DWORD bytesToSend)
|
||||
{
|
||||
if(!isOkay())return false;
|
||||
String packetIndicator = "PCKT|";
|
||||
packetIndicator+=String().fromULong(bytesToSend);
|
||||
packetIndicator+="\r\n";
|
||||
::send(mSocket, (char*)packetIndicator, packetIndicator.length(),0);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ClientSocketSender::sendPutIndicator(String fileName,DWORD fileLength)
|
||||
{
|
||||
if(!isOkay())return false;
|
||||
Block<String> parts = fileName.split('/');
|
||||
String pureFileName = parts[parts.size()-1];
|
||||
String putIndicator = "PUT|";
|
||||
putIndicator+=pureFileName;
|
||||
putIndicator+="|";
|
||||
putIndicator+=String().fromULong(fileLength);
|
||||
putIndicator+="\r\n";
|
||||
::send(mSocket, (char*)putIndicator, putIndicator.length(),0);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ClientSocketSender::sendQuit(void)
|
||||
{
|
||||
if(!isOkay())return false;
|
||||
String quitIndicator = "QUIT\r\n";
|
||||
::send(mSocket, (char*)quitIndicator, quitIndicator.length(),0);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ClientSocketSender::sendPacket(Array<char> &buffer,DWORD bytesToSend)
|
||||
{
|
||||
if(!isOkay())return false;
|
||||
::send(mSocket, (char*)&buffer[0], bytesToSend,0);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ClientSocketSender::isOkay(void)
|
||||
{
|
||||
return -1==mSocket?false:true;
|
||||
}
|
||||
Reference in New Issue
Block a user