// file ssocket.cpp
#include "stdhead.h"
#include "flsocket.h"
#include "ssocket.h"
bool ssocket::init(int port)
{
char *localHost;
int err = FALSE;
if (port <= 0)
return(FALSE);
if (server_init)
return(FALSE);
try
{
localHost = new char[1024];
}
catch(bad_alloc)
{
err = TRUE;
}
if (err)
return(FALSE);
if (gethostname(localHost, 1023))
{
delete localHost;
return(FALSE);
}
serverSocket =
socket(AF_INET, SOCK_STREAM, DEFAULT_PROTOCOL);
if (serverSocket == INVALID_SOCKET)
{
delete localHost;
return(FALSE);
}
memset(&sockServerAddr, 0, sizeof(sockServerAddr));
sockServerAddr.sin_family = AF_INET;
sockServerAddr.sin_addr.s_addr = INADDR_ANY;
sockServerAddr.sin_port = htons(port);
if (bind(serverSocket, (sockaddr *)&sockServerAddr,
sizeof(sockServerAddr))
== SOCKET_ERROR)
{
delete localHost;
return(FALSE);
}
if (listen(serverSocket, QUEUE_SIZE) == SOCKET_ERROR)
{
delete localHost;
return(FALSE);
}
srvclientSocket = INVALID_SOCKET;
server_hostname = localHost;
delete localHost;
server_init = TRUE;
return(TRUE);
}
bool ssocket::server_wait(void)
{
socklen_t len = sizeof(sockClientAddr);
if (!is_init())
return(FALSE);
srvclientSocket = INVALID_SOCKET;
srvclientSocket =
accept(serverSocket, (sockaddr *)&sockClientAddr, &len);
if (srvclientSocket == INVALID_SOCKET)
return(FALSE);
return(TRUE);
}
bool ssocket::close_client(void)
{
if (srvclientSocket == INVALID_SOCKET)
return(FALSE);
close(srvclientSocket);
srvclientSocket = INVALID_SOCKET;
return(TRUE);
}
bool ssocket::close_all(void)
{
if (srvclientSocket != INVALID_SOCKET)
close(srvclientSocket);
close(serverSocket);
return(TRUE);
}
int ssocket::recv_data(string& buf)
{
char *fbuf;
int charRecv, done = FALSE;
fbuf = new char[IPC_SR_BUFSIZE];
buf = "";
while(!done)
{
charRecv =
recv(srvclientSocket, fbuf, (IPC_SR_BUFSIZE - 1),
NO_FLAGS);
if (charRecv == SOCKET_ERROR)
{
delete fbuf;
return(0);
}
fbuf[charRecv] = EOS;
buf += fbuf;
if (charRecv < (IPC_SR_BUFSIZE - 1))
done = TRUE;
}
delete fbuf;
return(buf.length());
}
int ssocket::send_data(string& buf)
{
string fbuf;
int len, charSent, pos = 0, bytesToGo, done = FALSE;
int chunk;
len = buf.length();
if (!len)
return(0);
if (len < IPC_SR_BUFSIZE)
{
if ((charSent =
send(srvclientSocket, buf.c_str(),
len, NO_FLAGS)) == SOCKET_ERROR)
return(FALSE);
return(charSent);
}
bytesToGo = len;
while(!done)
{
if (bytesToGo > (IPC_SR_BUFSIZE - 1))
chunk = IPC_SR_BUFSIZE - 1;
else
chunk = bytesToGo;
fbuf = buf.substr(pos, chunk);
if ((charSent =
send(srvclientSocket, fbuf.c_str(),
chunk, NO_FLAGS)) == SOCKET_ERROR)
{
pos = 0;
break;
}
bytesToGo -= chunk;
pos += charSent;
if (bytesToGo <= 0)
done = TRUE;
}
return(pos);
}
End of Listing