Browse Source

blockMode is no longer stored on linux systems. Changed socket hostname to be stored as CStringS. changed getHostname() to return a ReadableString. Removed cSend and cRecv function forwards.

release/0.19
JustinAJ 11 years ago
parent
commit
7a06dd7f29
  1. 75
      Jupiter/Socket.cpp
  2. 18
      Jupiter/Socket.h

75
Jupiter/Socket.cpp

@ -29,27 +29,20 @@ typedef int SOCKET;
#include "Socket.h" #include "Socket.h"
#include "Functions.h" // makestr() #include "Functions.h" // makestr()
#include "CString.h"
int cSend(SOCKET s, const char *buf, int len, int flags)
{
return send(s, buf, len, flags);
}
int cRecv(SOCKET s, char *buf, int len, int flags)
{
return recv(s, buf, len, flags);
}
struct Jupiter::Socket::Data struct Jupiter::Socket::Data
{ {
SOCKET rawSock; SOCKET rawSock;
unsigned short port; unsigned short port;
char *host; Jupiter::CStringS host;
char *buff; char *buff;
size_t bufflen; size_t bufflen;
unsigned long blockMode;
int sockType; int sockType;
int sockProto; int sockProto;
#if defined _WIN32
unsigned long blockMode = 0;
#endif
Data(char *buffer, size_t bufferSize); Data(char *buffer, size_t bufferSize);
Data(const Data &); Data(const Data &);
~Data(); ~Data();
@ -61,10 +54,8 @@ Jupiter::Socket::Data::Data(char *buffer, size_t bufferSize)
Jupiter::Socket::Data::bufflen = bufferSize; Jupiter::Socket::Data::bufflen = bufferSize;
Jupiter::Socket::Data::port = 0; Jupiter::Socket::Data::port = 0;
Jupiter::Socket::Data::rawSock = 0; Jupiter::Socket::Data::rawSock = 0;
Jupiter::Socket::Data::blockMode = 0;
Jupiter::Socket::Data::sockType = SOCK_RAW; Jupiter::Socket::Data::sockType = SOCK_RAW;
Jupiter::Socket::Data::sockProto = IPPROTO_RAW; Jupiter::Socket::Data::sockProto = IPPROTO_RAW;
Jupiter::Socket::Data::host = nullptr;
for (unsigned int i = 0; i < Jupiter::Socket::Data::bufflen; i++) Jupiter::Socket::Data::buff[i] = 0; for (unsigned int i = 0; i < Jupiter::Socket::Data::bufflen; i++) Jupiter::Socket::Data::buff[i] = 0;
} }
@ -74,26 +65,18 @@ Jupiter::Socket::Data::Data(const Data &source)
Jupiter::Socket::Data::buff = new char[Jupiter::Socket::Data::bufflen]; Jupiter::Socket::Data::buff = new char[Jupiter::Socket::Data::bufflen];
Jupiter::Socket::Data::port = source.port; Jupiter::Socket::Data::port = source.port;
Jupiter::Socket::Data::rawSock = source.rawSock; Jupiter::Socket::Data::rawSock = source.rawSock;
Jupiter::Socket::Data::blockMode = source.blockMode;
Jupiter::Socket::Data::sockType = source.sockType; Jupiter::Socket::Data::sockType = source.sockType;
Jupiter::Socket::Data::sockProto = source.sockProto; Jupiter::Socket::Data::sockProto = source.sockProto;
Jupiter::Socket::Data::host = source.host; Jupiter::Socket::Data::host = source.host;
if (Jupiter::Socket::Data::host != nullptr) Jupiter::Socket::Data::host = makestr(Jupiter::Socket::Data::host); #if defined _WIN32
Jupiter::Socket::Data::blockMode = source.blockMode;
#endif
for (unsigned int i = 0; i < Jupiter::Socket::Data::bufflen; i++) Jupiter::Socket::Data::buff[i] = 0; for (unsigned int i = 0; i < Jupiter::Socket::Data::bufflen; i++) Jupiter::Socket::Data::buff[i] = 0;
} }
Jupiter::Socket::Data::~Data() Jupiter::Socket::Data::~Data()
{ {
if (Jupiter::Socket::Data::buff != nullptr) if (Jupiter::Socket::Data::buff != nullptr) delete[] Jupiter::Socket::Data::buff;
{
delete[] Jupiter::Socket::Data::buff;
Jupiter::Socket::Data::buff = nullptr;
}
if (Jupiter::Socket::Data::host != nullptr)
{
delete[] Jupiter::Socket::Data::host;
Jupiter::Socket::Data::host = nullptr;
}
} }
Jupiter::Socket::Socket() : Jupiter::Socket::Socket(4096) Jupiter::Socket::Socket() : Jupiter::Socket::Socket(4096)
@ -173,13 +156,12 @@ bool Jupiter::Socket::connectToHost(const char *hostname, unsigned short iPort,
#if defined _WIN32 #if defined _WIN32
if (!socketInit && !Jupiter::Socket::init()) return false; if (!socketInit && !Jupiter::Socket::init()) return false;
#endif // _WIN32 #endif // _WIN32
Jupiter::Socket::data_->host = new char[strlen(hostname)+1]; Jupiter::Socket::data_->host.set(hostname);
strcpy(Jupiter::Socket::data_->host, hostname);
Jupiter::Socket::data_->port = iPort; Jupiter::Socket::data_->port = iPort;
int i = 0; int i = 0;
static char portString[256]; static char portString[256];
sprintf(portString, "%hu", Jupiter::Socket::data_->port); sprintf(portString, "%hu", Jupiter::Socket::data_->port);
addrinfo *info = Jupiter::Socket::getAddrInfo(Jupiter::Socket::data_->host, portString); addrinfo *info = Jupiter::Socket::getAddrInfo(Jupiter::Socket::data_->host.c_str(), portString);
while (info != nullptr) while (info != nullptr)
{ {
addrinfo *ainfo = Jupiter::Socket::getAddrInfo(info, i); addrinfo *ainfo = Jupiter::Socket::getAddrInfo(info, i);
@ -208,13 +190,12 @@ bool Jupiter::Socket::bindToPort(const char *hostname, unsigned short iPort, boo
#if defined _WIN32 #if defined _WIN32
if (!socketInit && !Jupiter::Socket::init()) return false; if (!socketInit && !Jupiter::Socket::init()) return false;
#endif // _WIN32 #endif // _WIN32
Jupiter::Socket::data_->host = new char[strlen(hostname)+1]; Jupiter::Socket::data_->host.set(hostname);
strcpy(Jupiter::Socket::data_->host, hostname);
Jupiter::Socket::data_->port = iPort; Jupiter::Socket::data_->port = iPort;
int i = 0; int i = 0;
static char portString[256]; static char portString[256];
sprintf(portString, "%hu", Jupiter::Socket::data_->port); sprintf(portString, "%hu", Jupiter::Socket::data_->port);
addrinfo *info = Jupiter::Socket::getAddrInfo(Jupiter::Socket::data_->host, portString); addrinfo *info = Jupiter::Socket::getAddrInfo(Jupiter::Socket::data_->host.c_str(), portString);
while (info != nullptr) while (info != nullptr)
{ {
addrinfo *ainfo = Jupiter::Socket::getAddrInfo(info, i); addrinfo *ainfo = Jupiter::Socket::getAddrInfo(info, i);
@ -365,27 +346,38 @@ bool Jupiter::Socket::setTimeout(unsigned long milliseconds)
bool Jupiter::Socket::setBlocking(bool mode) bool Jupiter::Socket::setBlocking(bool mode)
{ {
Jupiter::Socket::data_->blockMode = !mode;
#if defined _WIN32 #if defined _WIN32
Jupiter::Socket::data_->blockMode = !mode;
return ioctlsocket(Jupiter::Socket::data_->rawSock, FIONBIO, &Jupiter::Socket::data_->blockMode) == 0; return ioctlsocket(Jupiter::Socket::data_->rawSock, FIONBIO, &Jupiter::Socket::data_->blockMode) == 0;
#else // _WIN32 #else // _WIN32
int flags = fcntl(Jupiter::Socket::data_->rawSock, F_GETFL, 0); int flags = fcntl(Jupiter::Socket::data_->rawSock, F_GETFL, 0);
if (flags < 0) return 0; if (flags < 0) return 0;
flags = Jupiter::Socket::data_->blockMode ? (flags&~O_NONBLOCK) : (flags|O_NONBLOCK); flags = mode ? (flags|O_NONBLOCK) : (flags&~O_NONBLOCK);
return fcntl(Jupiter::Socket::data_->rawSock, F_SETFL, flags) == 0; return fcntl(Jupiter::Socket::data_->rawSock, F_SETFL, flags) == 0;
#endif // _WIN32 #endif // _WIN32
} }
bool Jupiter::Socket::getBlockingMode() const bool Jupiter::Socket::getBlockingMode() const
{ {
#if defined _WIN32
return !Jupiter::Socket::data_->blockMode; return !Jupiter::Socket::data_->blockMode;
#else // _WIN32
int flags = fcntl(sock_fd, F_GETFL, 0);
if (flags == -1) return false;
return !(flags & O_NONBLOCK);
#endif
} }
const char *Jupiter::Socket::getHost() const const Jupiter::ReadableString &Jupiter::Socket::getHostname() const
{ {
return Jupiter::Socket::data_->host; return Jupiter::Socket::data_->host;
} }
const char *Jupiter::Socket::getHost() const
{
return Jupiter::Socket::data_->host.c_str();
}
unsigned short Jupiter::Socket::getPort() const unsigned short Jupiter::Socket::getPort() const
{ {
return Jupiter::Socket::data_->port; return Jupiter::Socket::data_->port;
@ -411,7 +403,7 @@ char *Jupiter::Socket::setBufferSize(size_t size)
return Jupiter::Socket::data_->buff; return Jupiter::Socket::data_->buff;
} }
unsigned int Jupiter::Socket::getBufferSize() const size_t Jupiter::Socket::getBufferSize() const
{ {
return Jupiter::Socket::data_->bufflen; return Jupiter::Socket::data_->bufflen;
} }
@ -422,11 +414,6 @@ const char *Jupiter::Socket::getData()
return nullptr; return nullptr;
} }
const char *Jupiter::Socket::getHostname() const
{
return Jupiter::Socket::data_->host;
}
const char *Jupiter::Socket::getLocalHostname() // static const char *Jupiter::Socket::getLocalHostname() // static
{ {
static char localHostname[NI_MAXHOST]; static char localHostname[NI_MAXHOST];
@ -441,7 +428,7 @@ void Jupiter::Socket::clearBuffer()
int Jupiter::Socket::send(const char *data, size_t datalen) int Jupiter::Socket::send(const char *data, size_t datalen)
{ {
return cSend(Jupiter::Socket::data_->rawSock, data, datalen, 0); return ::send(Jupiter::Socket::data_->rawSock, data, datalen, 0);
} }
int Jupiter::Socket::send(const char *msg) int Jupiter::Socket::send(const char *msg)
@ -471,7 +458,7 @@ int Jupiter::Socket::sendData(const char *msg)
int Jupiter::Socket::peek() int Jupiter::Socket::peek()
{ {
int r = cRecv(Jupiter::Socket::data_->rawSock, Jupiter::Socket::data_->buff, Jupiter::Socket::data_->bufflen-1, MSG_PEEK); int r = ::recv(Jupiter::Socket::data_->rawSock, Jupiter::Socket::data_->buff, Jupiter::Socket::data_->bufflen - 1, MSG_PEEK);
if (r >= 0) Jupiter::Socket::data_->buff[r] = 0; if (r >= 0) Jupiter::Socket::data_->buff[r] = 0;
return r; return r;
} }
@ -502,7 +489,7 @@ int Jupiter::Socket::peekFrom(addrinfo *info)
int Jupiter::Socket::recv() int Jupiter::Socket::recv()
{ {
int r = cRecv(Jupiter::Socket::data_->rawSock, Jupiter::Socket::data_->buff, Jupiter::Socket::data_->bufflen-1, 0); int r = ::recv(Jupiter::Socket::data_->rawSock, Jupiter::Socket::data_->buff, Jupiter::Socket::data_->bufflen - 1, 0);
if (r >= 0) Jupiter::Socket::data_->buff[r] = 0; if (r >= 0) Jupiter::Socket::data_->buff[r] = 0;
return r; return r;
} }

18
Jupiter/Socket.h

@ -25,6 +25,7 @@
#include <cstring> #include <cstring>
#include "Jupiter.h" #include "Jupiter.h"
#include "Readable_String.h"
struct addrinfo; struct addrinfo;
@ -252,6 +253,13 @@ namespace Jupiter
* *
* @return String containing the hostname. * @return String containing the hostname.
*/ */
const Jupiter::ReadableString &getHostname() const;
/**
* @brief Returns the hostname of the server that the socket is connected to.
*
* @return String containing the hostname.
*/
const char *getHost() const; const char *getHost() const;
/** /**
@ -303,7 +311,7 @@ namespace Jupiter
* *
* @return Size of the buffer. * @return Size of the buffer.
*/ */
unsigned int getBufferSize() const; size_t getBufferSize() const;
/** /**
* @brief Copies any new socket data to the buffer and returns it. * @brief Copies any new socket data to the buffer and returns it.
@ -312,14 +320,6 @@ namespace Jupiter
*/ */
const char *getData(); const char *getData();
/**
* @brief Returns the hostname of the server that the socket is connected to.
* Note: This is the same as getHost().
*
* @return String containing the hostname.
*/
const char *getHostname() const;
/** /**
* @brief Returns the local hostname of the local machine. * @brief Returns the local hostname of the local machine.
* Note: This allocated static memory, and should be copied for storage. * Note: This allocated static memory, and should be copied for storage.

Loading…
Cancel
Save