topical media & game development
lib-of-vs-addons-ofxNetwork-src-ofxTCPServer.cpp / cpp
include <ofxTCPServer.h>
include <ofxTCPClient.h>
//--------------------------
ofxTCPServer::ofxTCPServer(){
verbose = true;
connected = false;
count = 0;
port = 0;
str = "";
TCPConnections = new ofxTCPClient[TCP_MAX_CLIENTS];
}
//--------------------------
ofxTCPServer::~ofxTCPServer(){
close();
}
//--------------------------
void ofxTCPServer::setVerbose(bool _verbose){
verbose = _verbose;
}
//--------------------------
bool ofxTCPServer::setup(int _port, bool blocking){
if( !TCPServer.Create() ){
if(verbose)printf("ofxTCPServer: create() failed\n");
return false;
}
if( !TCPServer.Bind(_port) ){
if(verbose)printf("ofxTCPServer: bind(port = \%i) failed\n", _port);
return false;
}
connected = true;
port = _port;
bClientBlocking = blocking;
startThread(true, false);
return true;
}
//--------------------------
bool ofxTCPServer::close(){
if(!connected) return true;
for(int i = 0; i < count; i++){
TCPConnections[i].close();
}
stopThread(); //stop the thread
if( !TCPServer.Close() ){
if(verbose)printf("ofxTCPServer: unable to close connection\n");
return false;
}else{
connected = false;
return true;
}
}
//--------------------------
bool ofxTCPServer::disconnectClient(int clientID){
if( !isClientSetup(clientID) ){
if(verbose)printf("ofxTCPServer: client \%i doesn't exist\n", clientID);
return false;
}
else if(TCPConnections[clientID].close()){
return true;
}
return false;
}
//--------------------------
bool ofxTCPServer::send(int clientID, string message){
if( !isClientSetup(clientID) ){
if(verbose)printf("ofxTCPServer: client \%i doesn't exist\n", clientID);
return false;
}
else{
TCPConnections[clientID].send(message);
return true;
}
}
//--------------------------
bool ofxTCPServer::sendToAll(string message){
if(count == 0) return false;
for(int i = 0; i < count; i++){
if(TCPConnections[i].isConnected())TCPConnections[i].send(message);
}
return true;
}
//--------------------------
string ofxTCPServer::receive(int clientID){
if( !isClientSetup(clientID) ){
if(verbose)printf("ofxTCPServer: client \%i doesn't exist\n", clientID);
return "client doesn't exist";
}
return TCPConnections[clientID].receive();
}
//--------------------------
bool ofxTCPServer::sendRawBytes(int clientID, const char * rawBytes, const int numBytes){
if( !isClientSetup(clientID) ){
if(verbose)printf("ofxTCPServer: client \%i doesn't exist\n", clientID);
return false;
}
else{
return TCPConnections[clientID].sendRawBytes(rawBytes, numBytes);
}
}
//--------------------------
bool ofxTCPServer::sendRawBytesToAll(const char * rawBytes, const int numBytes){
if(count == 0 || numBytes <= 0) return false;
for(int i = 0; i < count; i++){
if(TCPConnections[i].isConnected())TCPConnections[i].sendRawBytes(rawBytes, numBytes);
}
return true;
}
//--------------------------
int ofxTCPServer::getNumReceivedBytes(int clientID){
if( !isClientSetup(clientID) ){
if(verbose)printf("ofxTCPServer: client \%i doesn't exist\n", clientID);
return 0;
}
return TCPConnections[clientID].getNumReceivedBytes();
}
//--------------------------
int ofxTCPServer::receiveRawBytes(int clientID, char * receiveBytes, int numBytes){
if( !isClientSetup(clientID) ){
if(verbose)printf("ofxTCPServer: client \%i doesn't exist\n", clientID);
return 0;
}
return TCPConnections[clientID].receiveRawBytes(receiveBytes, numBytes);
}
//--------------------------
int ofxTCPServer::getClientPort(int clientID){
if( !isClientSetup(clientID) ){
if(verbose)printf("ofxTCPServer: client \%i doesn't exist\n", clientID);
return 0;
}
else return TCPConnections[clientID].getPort();
}
//--------------------------
string ofxTCPServer::getClientIP(int clientID){
if( !isClientSetup(clientID) ){
if(verbose)printf("ofxTCPServer: client \%i doesn't exist\n", clientID);
return "000.000.000.000";
}
else return TCPConnections[clientID].getIP();
}
//--------------------------
int ofxTCPServer::getNumClients(){
return count;
}
//--------------------------
int ofxTCPServer::getPort(){
return port;
}
//--------------------------
bool ofxTCPServer::isConnected(){
return connected;
}
//--------------------------
bool ofxTCPServer::isClientSetup(int clientID){
return (clientID < count && clientID < TCP_MAX_CLIENTS);
}
//--------------------------
bool ofxTCPServer::isClientConnected(int clientID){
return isClientSetup(clientID) && TCPConnections[clientID].isConnected();
}
//don't call this
//--------------------------
void ofxTCPServer::threadedFunction(){
while( isThreadRunning() ){
if(count == TCP_MAX_CLIENTS){
if(verbose)printf("ofxTCPServer: reached max connected clients! \nofxTCPServer: no more connections accepted\n");
break;
}
if( !TCPServer.Listen(TCP_MAX_CLIENTS) ){
if(verbose)printf("ofxTCPServer: Listen() failed\n");
}
if( !TCPServer.Accept(TCPConnections[count].TCPClient) ){
if(verbose)printf("ofxTCPServer: Accept() failed\n");
continue;
}else{
TCPConnections[count].setup(count, bClientBlocking);
count++;
if(verbose)printf("ofxTCPServer: client \%i connected on port \%i\n", count, TCPConnections[count].getPort());
}
}
if(verbose)printf("ofxTCPServer: listen thread ended\n");
}
(C) Æliens
04/09/2009
You may not copy or print any of this material without explicit permission of the author or the publisher.
In case of other copyright issues, contact the author.