#include "inet.h"
#include <iostream>
#include <sstream>
#include <exception>
using namespace std;
#include "thread.cpp"
#include "sock_io.cpp"
#include "tstash.h"
#include <QtDebug>
typedef void* (*p_VOID_FUNCT)(void*);
class tcpip_server {
static int socketfd, newsocketfd;
socklen_t clilen;
struct sockaddr_in cli_addr, serv_addr;
ushort port;
// struct sock_addr_in accept_ip_struct;
int accept_ip_address;
int client_ip_address;
public:
static bool running;
static void* str_echo(void* p_void);
// struct sock_addr_in client_ip_struct;
public:
tcpip_server(int accept_ip_addr,
ushort port_port,
p_VOID_FUNCT p_void_funct, Ui::tcpipClass ui):
accept_ip_address(accept_ip_addr),
port(port_port)
{
int setreuse=1;
int istatus;
//
// server constructor section
//
/*
* Open a TCP socket (an Internet stream socket).
*/
if ( (socketfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
qDebug()<<"socketfd = socket(AF_INET, SOCK_STREAM, 0)) < 0";
return;
}
qDebug()<<"socketfd = socket(AF_INET, SOCK_STREAM, 0))"<<socketfd;
int errorDup = dup2(socketfd,20);
qDebug()<<"errorDup"<<errorDup;
qDebug()<<"socketfd = socket(AF_INET, SOCK_STREAM, 0))"<<socketfd;
/*
* Bind our local address so that the client can send to us.
*/
memset((char *) &serv_addr,0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(SERV_TCP_PORT);
/********************* set up so several server processes **************/
/***** can use the same port ******************************************/
if(istatus = setsockopt(socketfd, SOL_SOCKET, SO_REUSEADDR,
(char *) &setreuse, sizeof(setreuse)))
{
qDebug()<<"setsockopt";
return;
}
if (bind(socketfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
{
qDebug()<<"bind";
return;
}
listen(socketfd, 5);
tstash<sock_io> vector_psio;
void* p_void = NULL;
running = true;
while(1)
{
clilen = sizeof(cli_addr);
qDebug()<<"enter accept()";
newsocketfd = accept(socketfd, (struct sockaddr *) &cli_addr,
&clilen);
// (unsigned int*)&clilen);
qDebug()<<"newsocketfd"<<newsocketfd;
qDebug()<<"exit accept()";
if (newsocketfd < 0)
{
return;
}
sock_io* p_sio = new sock_io( newsocketfd);
p_void = (void*)p_sio;
tthread* p_thread = new tthread( p_void_funct, p_void);
p_thread->run();
}
}
// destructor
~tcpip_server()
{
close(socketfd); /* close original socket */
}
};// end of class declaration
/*
* Read a stream socket one line at a time, and write each line back
* to the sender.
*/
#define MAXLINE 512
bool tcpip_server::running = true;
int tcpip_server::socketfd = 0;
int tcpip_server::newsocketfd = 0;
void* tcpip_server::str_echo(void* p_void)
{
sock_io* p_sio = (sock_io*)p_void;
int n;
char line[MAXLINE];
const char* pline = line;
bool exitNow = false;
do
{
n = p_sio->tcp_read(line);
// cout<<n<<"characters received"<<endl;
if(!n)
{
running = false;
close(socketfd);
close(newsocketfd);
qDebug()<<"str_echo tried to close";
exit(0);
}
line[n] = '\n';
line[n+1] = 0;
n++;
qstr.trimmed();
qDebug()<<"_____"<<qstr<<"_________";
{
qDebug()<<"close detected";
running = false;
close(socketfd);
close(newsocketfd);
exitNow = true;
break;
}
p_sio->tcp_write(line, n);
} while(1);
void* p_void_exit=0;
// destruct thread object, work done
delete p_sio;
pthread_exit(p_void_exit);
if (exitNow) exit(0);
return p_void_exit;
}