Files
WickedEngine/WickedEngine/wiClient.h
T
2017-05-03 17:02:00 +02:00

153 lines
3.0 KiB
C++

#ifndef CLIENT_H
#define CLIENT_H
#include "wiNetwork.h"
class wiClient : public wiNetwork
{
#ifndef WINSTORE_SUPPORT
public:
wiClient(const std::string& newName = "CLIENT", const std::string& ipaddress = "127.0.0.1", int port = PORT);
~wiClient(void);
std::string serverName;
bool sendText(const std::string& text);
bool receiveText(std::string& newName);
template <typename T>
bool sendData(const T& value){
Network::sendData(PACKET_TYPE_OTHER,s);
return Network::sendData(value,s);
}
template <typename T>
bool receiveData(T& value){
return wiNetwork::receiveData(value,s);
}
bool changeName(const std::string& newName);
bool sendMessage(const std::string& text);
bool ConnectToHost(int PortNo, const char* IPAddress)
{
WSAData wsadata;
int error = WSAStartup(SCK_VERSION2,&wsadata);
if(error)
return false;
if(wsadata.wVersion != SCK_VERSION2){
WSACleanup();
return false;
}
SOCKADDR_IN target;
target.sin_family = AF_INET;
target.sin_port = htons(PortNo);
target.sin_addr.S_un.S_addr = inet_addr(IPAddress);
s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(s == INVALID_SOCKET){
return false;
}
int opt = TRUE;
if( setsockopt(s, SOL_SOCKET, TCP_NODELAY, (char *)&opt, sizeof(opt)) < 0 )
return false;
//Try connecting:
if(connect(s, (SOCKADDR*)&target, sizeof(target)) == SOCKET_ERROR){
return false;
}
else
return true;
}
template<typename T>
void Poll(T& data)
{
if(!success)
return;
//clear the socket set
FD_ZERO(&readfds);
//add master socket to set
FD_SET(s, &readfds);
//wait for an activity on one of the sockets , timeout is NULL , so wait indefinitely
timeval time=timeval();
time.tv_sec=0;
time.tv_usec=1;
if ((select( (int)s + 1, &readfds , NULL , NULL , &time) < 0) && (errno!=EINTR))
{
wiBackLog::post("select error");
}
//If something happened on the master socket , then its an incoming connection
if (FD_ISSET(s, &readfds))
{
int command;
bool receiveSuccess = receiveData(command);
if(!receiveSuccess){
wiBackLog::post("Server no longer available. Please disconnect.");
closesocket(s);
success=false;
}
else{
switch(command){
case PACKET_TYPE_CHANGENAME:
{
string text;
if(receiveText(text)){
stringstream ss("");
ss<<"New server name is: "<<text;
wiBackLog::post(ss.str().c_str());
serverName=text;
}
break;
}
case PACKET_TYPE_TEXTMESSAGE:
{
string text;
if(receiveText(text)){
stringstream ss("");
ss<<serverName<<": "<<text;
wiBackLog::post(ss.str().c_str());
}
break;
}
case PACKET_TYPE_OTHER:
{
wiNetwork::receiveData(data,s);
break;
}
default:
break;
}
}
}
}
#else
public:
wiClient(const std::string& newName = "CLIENT", const std::string& ipaddress = "127.0.0.1", int port = PORT) {}
template<typename T>
void Poll(T& data) {}
#endif // WINSTORE_SUPPORT
};
#endif