#include "Networks.h"
//===============================================//
//= ServerTCP =//
//===============================================//
bool Networks::ServerTCP()
{
is_Server = true;
if(!initWSASocket())
return false;
if(!createWSASocket())
return false;
if(!bindSocket())
return false;
//Qui forse ci vuole un while true
if(!acceptWSASocket())
return false;
isConnected = true;
return true;
}
//===============================================//
//= ClientTCP =//
//===============================================//
bool Networks::ClientTCP()
{
is_Client = true;
if(!initWSASocket())
return false;
if(!createWSASocket())
return false;
if(!connectWSASocket())
return false;
isConnected = true;
return true;
}
//===============================================//
//= initWSASocket =//
//===============================================//
bool Networks::initWSASocket()
{
int WsaResult = WSAStartup(DllVersion, &wsaData);
if(WsaResult != 0)
{
std::cout << "Fallito WSAStartup()." << std::endl;
return false;
}
return true;
}
//===============================================//
//= createWSASocket =//
//===============================================//
bool Networks::createWSASocket()
{
m_socket = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, (unsigned int)NULL, (unsigned int)NULL);
if(m_socket == INVALID_SOCKET)
return false;
memset(&si, 0, sizeof(si));
if(is_Server == true)
{
si.sin_family = AF_INET;
si.sin_addr.s_addr = INADDR_ANY;
si.sin_port = htons(4445);
}
else if(is_Client == true)
{
si.sin_family = AF_INET;
si.sin_port = htons(4445);
si.sin_addr.s_addr = inet_addr("127.0.0.1");
}
else
{
std::cout << "Il socket non e' ne di tipo server ne di tipo client" << std::endl;
return false;
}
return true;
}
//===============================================//
//= closeWSASocket =//
//===============================================//
bool Networks::closeWSASocket()
{
if(is_Server == true)
{
if(!closesocket(a_socket))
return false;
}
if(!closesocket(m_socket))
return false;
if(!WSACleanup())
return false;
return true;
}
//===============================================//
//= connectWSASocket =//
//===============================================//
bool Networks::connectWSASocket()
{
int ConnResult = WSAConnect(m_socket, (struct sockaddr*)&si, sizeof(si), NULL, NULL, NULL, NULL);
if(ConnResult == SOCKET_ERROR)
{
std::cout << "errore %d"<< WSAGetLastError() << std::endl;
closeWSASocket();
return false;
}
return true;
}
//===============================================//
//= bindSocket =//
//===============================================//
bool Networks::bindSocket()
{
if (bind(m_socket, (struct sockaddr*)&si, sizeof(si)) == SOCKET_ERROR)
{
std::cout << "Fallito bindSocket(). Errore: " << WSAGetLastError() << std::endl;
closeWSASocket();
return false;
}
//Listen
if(listen(m_socket, 3) == SOCKET_ERROR)
{
std::cout << "Fallito listen(). Errore: " << WSAGetLastError() << std::endl;
closeWSASocket();
return false;
}
return true;
}
//===============================================//
//= acceptWSASocket =//
//===============================================//
bool Networks::acceptWSASocket()
{
int len = sizeof(a_si);
if(a_socket = WSAAccept(m_socket, (struct sockaddr*)&a_si, &len,NULL,0) == SOCKET_ERROR)
{
std::cout << "Fallito WSAAccept(). Errore: " << WSAGetLastError() << std::endl;
closeWSASocket();
return false;
}
return true;
}
//===============================================//
//= Send =//
//===============================================//
bool Networks::Send(const char *sendbuffer)
{
int ResultSend;
if(is_Server == true)
ResultSend = send(a_socket, sendbuffer, (int) strlen(sendbuffer), 0);
else if(is_Client == true)
ResultSend = send(m_socket, sendbuffer, (int) strlen(sendbuffer), 0);
else
{
std::cout << "Nessun socket specificato!!!" << std::endl;
return false;
}
if(ResultSend == SOCKET_ERROR)
{
std::cout << "Errore Send(): " << WSAGetLastError() << std::endl;
closeWSASocket();
return false;
}
std::cout << "Messaggio inviato!" << std::endl;
return true;
}
//===============================================//
//= Recv =//
//===============================================//
bool Networks::Recv()
{
int recvbufflen = 1024;
char recvbuffer[recvbufflen];
int ResultRecv;
do
{
if(is_Server == true)
{
ResultRecv = recv(a_socket,recvbuffer, recvbufflen, 0);
}
else if(is_Client == true)
{
ResultRecv = recv(m_socket,recvbuffer, recvbufflen, 0);
}
else
{
std::cout << "Nessun socket specificato!!!" << std::endl;
return false;
}
if(ResultRecv > 0)
std::cout << "byte ricevuti" << ResultRecv << " " << recvbuffer << std::endl;
else if(ResultRecv == 0)
std::cout << "Connesione chiusa!" << std::endl;
else
std::cout << "Error Recv(): " << WSAGetLastError() << std::endl;
} while (ResultRecv > 0);
return true;
}