Added hostBytesToStr function to socket library, fixed code style, fixed UDP Cygwin support
This commit is contained in:
parent
567759ce26
commit
629b24853a
3 changed files with 544 additions and 617 deletions
802
lib/socket.cpp
802
lib/socket.cpp
File diff suppressed because it is too large
Load diff
116
lib/socket.h
116
lib/socket.h
|
@ -3,48 +3,51 @@
|
|||
/// Written by Jaron Vietor in 2010 for DDVTech
|
||||
|
||||
#pragma once
|
||||
#include <string>
|
||||
#include <sstream>
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/un.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#include <fcntl.h>
|
||||
#include <deque>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <sstream>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <string>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/un.h>
|
||||
#include <unistd.h>
|
||||
|
||||
//for being friendly with Socket::Connection down below
|
||||
namespace Buffer {
|
||||
// for being friendly with Socket::Connection down below
|
||||
namespace Buffer{
|
||||
class user;
|
||||
}
|
||||
|
||||
///Holds Socket tools.
|
||||
namespace Socket {
|
||||
/// Holds Socket tools.
|
||||
namespace Socket{
|
||||
|
||||
void hostBytesToStr(const char *bytes, size_t len, std::string &target);
|
||||
|
||||
/// A buffer made out of std::string objects that can be efficiently read from and written to.
|
||||
class Buffer {
|
||||
class Buffer{
|
||||
private:
|
||||
std::deque<std::string> data;
|
||||
|
||||
public:
|
||||
unsigned int size();
|
||||
unsigned int bytes(unsigned int max);
|
||||
void append(const std::string & newdata);
|
||||
void append(const char * newdata, const unsigned int newdatasize);
|
||||
void prepend(const std::string & newdata);
|
||||
void prepend(const char * newdata, const unsigned int newdatasize);
|
||||
std::string & get();
|
||||
void append(const std::string &newdata);
|
||||
void append(const char *newdata, const unsigned int newdatasize);
|
||||
void prepend(const std::string &newdata);
|
||||
void prepend(const char *newdata, const unsigned int newdatasize);
|
||||
std::string &get();
|
||||
bool available(unsigned int count);
|
||||
std::string remove(unsigned int count);
|
||||
std::string copy(unsigned int count);
|
||||
void clear();
|
||||
};
|
||||
//Buffer
|
||||
// Buffer
|
||||
|
||||
/// This class is for easy communicating through sockets, either TCP or Unix.
|
||||
class Connection {
|
||||
class Connection{
|
||||
private:
|
||||
int sock; ///< Internally saved socket number.
|
||||
int pipes[2]; ///< Internally saved file descriptors for pipe socket simulation.
|
||||
|
@ -53,20 +56,20 @@ namespace Socket {
|
|||
uint64_t down;
|
||||
long long int conntime;
|
||||
Buffer downbuffer; ///< Stores temporary data coming in.
|
||||
int iread(void * buffer, int len, int flags = 0); ///< Incremental read call.
|
||||
unsigned int iwrite(const void * buffer, int len); ///< Incremental write call.
|
||||
bool iread(Buffer & buffer, int flags = 0); ///< Incremental write call that is compatible with Socket::Buffer.
|
||||
bool iwrite(std::string & buffer); ///< Write call that is compatible with std::string.
|
||||
int iread(void *buffer, int len, int flags = 0); ///< Incremental read call.
|
||||
unsigned int iwrite(const void *buffer, int len); ///< Incremental write call.
|
||||
bool iread(Buffer &buffer, int flags = 0); ///< Incremental write call that is compatible with Socket::Buffer.
|
||||
bool iwrite(std::string &buffer); ///< Write call that is compatible with std::string.
|
||||
public:
|
||||
//friends
|
||||
// friends
|
||||
friend class ::Buffer::user;
|
||||
//constructors
|
||||
// constructors
|
||||
Connection(); ///< Create a new disconnected base socket.
|
||||
Connection(int sockNo); ///< Create a new base socket.
|
||||
Connection(std::string hostname, int port, bool nonblock); ///< Create a new TCP socket.
|
||||
Connection(std::string adres, bool nonblock = false); ///< Create a new Unix Socket.
|
||||
Connection(int write, int read); ///< Simulate a socket using two file descriptors.
|
||||
//generic methods
|
||||
// generic methods
|
||||
void close(); ///< Close connection.
|
||||
void drop(); ///< Close connection without shutdown.
|
||||
void setBlocking(bool blocking); ///< Set this socket to be blocking (true) or nonblocking (false).
|
||||
|
@ -79,29 +82,30 @@ namespace Socket {
|
|||
std::string getError(); ///< Returns a string describing the last error that occured.
|
||||
bool connected() const; ///< Returns the connected-state for this socket.
|
||||
bool isAddress(std::string addr);
|
||||
//buffered i/o methods
|
||||
// buffered i/o methods
|
||||
bool spool(); ///< Updates the downbufferinternal variables.
|
||||
bool peek(); ///< Clears the downbuffer and fills it with peek
|
||||
Buffer & Received(); ///< Returns a reference to the download buffer.
|
||||
void SendNow(const std::string & data); ///< Will not buffer anything but always send right away. Blocks.
|
||||
void SendNow(const char * data); ///< Will not buffer anything but always send right away. Blocks.
|
||||
void SendNow(const char * data, size_t len); ///< Will not buffer anything but always send right away. Blocks.
|
||||
//stats related methods
|
||||
unsigned int connTime();///< Returns the time this socket has been connected.
|
||||
Buffer &Received(); ///< Returns a reference to the download buffer.
|
||||
void SendNow(const std::string &data); ///< Will not buffer anything but always send right away. Blocks.
|
||||
void SendNow(const char *data); ///< Will not buffer anything but always send right away. Blocks.
|
||||
void SendNow(const char *data, size_t len); ///< Will not buffer anything but always send right away. Blocks.
|
||||
// stats related methods
|
||||
unsigned int connTime(); ///< Returns the time this socket has been connected.
|
||||
uint64_t dataUp(); ///< Returns total amount of bytes sent.
|
||||
uint64_t dataDown(); ///< Returns total amount of bytes received.
|
||||
void resetCounter(); ///< Resets the up/down bytes counter to zero.
|
||||
std::string getStats(std::string C); ///< Returns a std::string of stats, ended by a newline.
|
||||
friend class Server;
|
||||
bool Error; ///< Set to true if a socket error happened.
|
||||
bool Blocking; ///< Set to true if a socket is currently or wants to be blocking.
|
||||
//overloaded operators
|
||||
bool operator==(const Connection & B) const;
|
||||
bool operator!=(const Connection & B) const;
|
||||
// overloaded operators
|
||||
bool operator==(const Connection &B) const;
|
||||
bool operator!=(const Connection &B) const;
|
||||
operator bool() const;
|
||||
};
|
||||
|
||||
/// This class is for easily setting up listening socket, either TCP or Unix.
|
||||
class Server {
|
||||
class Server{
|
||||
private:
|
||||
std::string errors; ///< Stores errors that may have occured.
|
||||
int sock; ///< Internally saved socket number.
|
||||
|
@ -120,33 +124,33 @@ namespace Socket {
|
|||
int getSocket(); ///< Returns internal socket number.
|
||||
};
|
||||
|
||||
class UDPConnection {
|
||||
class UDPConnection{
|
||||
private:
|
||||
int sock; ///< Internally saved socket number.
|
||||
std::string remotehost;///< Stores remote host address
|
||||
void * destAddr;///< Destination address pointer.
|
||||
unsigned int destAddr_size;///< Size of the destination address pointer.
|
||||
unsigned int up;///< Amount of bytes transferred up.
|
||||
unsigned int down;///< Amount of bytes transferred down.
|
||||
unsigned int data_size;///< The size in bytes of the allocated space in the data pointer.
|
||||
int family;///<Current socket address family
|
||||
std::string remotehost; ///< Stores remote host address
|
||||
void *destAddr; ///< Destination address pointer.
|
||||
unsigned int destAddr_size; ///< Size of the destination address pointer.
|
||||
unsigned int up; ///< Amount of bytes transferred up.
|
||||
unsigned int down; ///< Amount of bytes transferred down.
|
||||
unsigned int data_size; ///< The size in bytes of the allocated space in the data pointer.
|
||||
int family; ///<Current socket address family
|
||||
public:
|
||||
char * data;///< Holds the last received packet.
|
||||
char *data; ///< Holds the last received packet.
|
||||
unsigned int data_len; ///< The size in bytes of the last received packet.
|
||||
UDPConnection(const UDPConnection & o);
|
||||
UDPConnection(const UDPConnection &o);
|
||||
UDPConnection(bool nonblock = false);
|
||||
~UDPConnection();
|
||||
void close();
|
||||
int getSock();
|
||||
int bind(int port, std::string iface = "", const std::string & multicastAddress = "");
|
||||
int bind(int port, std::string iface = "", const std::string &multicastAddress = "");
|
||||
void setBlocking(bool blocking);
|
||||
void SetDestination(std::string hostname, uint32_t port);
|
||||
void GetDestination(std::string & hostname, uint32_t & port);
|
||||
void GetDestination(std::string &hostname, uint32_t &port);
|
||||
uint32_t getDestPort() const;
|
||||
bool Receive();
|
||||
void SendNow(const std::string & data);
|
||||
void SendNow(const char * data);
|
||||
void SendNow(const char * data, size_t len);
|
||||
void SendNow(const std::string &data);
|
||||
void SendNow(const char *data);
|
||||
void SendNow(const char *data, size_t len);
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -49,16 +49,7 @@ std::string Controller::sessIndex::toStr(){
|
|||
/// Initializes a sessIndex from a statExchange object, converting binary format IP addresses into strings.
|
||||
/// This extracts the host, stream name, connector and crc field, ignoring everything else.
|
||||
Controller::sessIndex::sessIndex(IPC::statExchange & data){
|
||||
std::string tHost = data.host();
|
||||
if (tHost.substr(0, 12) == std::string("\000\000\000\000\000\000\000\000\000\000\377\377", 12)){
|
||||
char tmpstr[16];
|
||||
snprintf(tmpstr, 16, "%hhu.%hhu.%hhu.%hhu", tHost[12], tHost[13], tHost[14], tHost[15]);
|
||||
host = tmpstr;
|
||||
}else{
|
||||
char tmpstr[40];
|
||||
snprintf(tmpstr, 40, "%0.2x%0.2x:%0.2x%0.2x:%0.2x%0.2x:%0.2x%0.2x:%0.2x%0.2x:%0.2x%0.2x:%0.2x%0.2x:%0.2x%0.2x", tHost[0], tHost[1], tHost[2], tHost[3], tHost[4], tHost[5], tHost[6], tHost[7], tHost[8], tHost[9], tHost[10], tHost[11], tHost[12], tHost[13], tHost[14], tHost[15]);
|
||||
host = tmpstr;
|
||||
}
|
||||
Socket::hostBytesToStr(data.host().c_str(), 16, host);
|
||||
streamName = data.streamName();
|
||||
connector = data.connector();
|
||||
crc = data.crc();
|
||||
|
|
Loading…
Add table
Reference in a new issue