/*
Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Her Majesty the Queen in
Right of Canada (Communications Research Center Canada)
*/
/*
This file is part of CRC-DabMux.
CRC-DabMux is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
CRC-DabMux is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with CRC-DabMux. If not, see .
*/
#include "TcpSocket.h"
#include
#include
#include
#include
#include
#ifdef _WIN32
#else
# include
#endif
#ifdef TRACE_ON
# ifndef TRACE_CLASS
# define TRACE_CLASS(class, func) cout <<"-" <<(class) <<"\t(" < 0 if ok, -1 (SOCKET_ERROR) if error
*/
int TcpSocket::telnetRead(void* data, int size)
{
TRACE_CLASS("TcpSocket", "read(void*, size)");
int ret;
printf("selectCall\n");
printf("readread 1\n");
char *line=GetLine(listenSocket);
ret=strlen(line);
printf("readread 2\n");
if (ret <= size)
{
strcpy((char*)data, line);
}
else
{
// size_t n = size;
strcpy((char*)data, line);
ret = size;
}
printf("TELNET READ returned %d\n", ret);
return ret;
}
/**
* Receive a TCP stream.
* @param data The buffer that will receive data.
* @param size The buffer size.
* @return > 0 if ok, -1 (SOCKET_ERROR) if error
*/
int TcpSocket::read(void* data, int size)
{
TRACE_CLASS("TcpSocket", "read(void*, size)");
int ret = recv(listenSocket, (char*)data, size, 0);
if (ret == SOCKET_ERROR) {
setInetError("Can't receive TCP packet");
return -1;
}
return ret;
}
#define MAX 512
char* TcpSocket::GetLine(int fd)
{
static char line[MAX];
static char netread[MAX] = "";
int n, len;
char *p;
len = strlen(netread);
/* look for \r\n in netread buffer */
p = strstr(netread, "\r\n");
if (p == NULL) {
/* fill buff - no \r\n found */
//n = ::read(fd, (void*)(netread+len), (size_t)(MAX-len));
n = recv(fd, (netread+len), MAX-len, 0);
if (n == SOCKET_ERROR) {
setInetError("Can't receive TCP packet");
return NULL;
}
len += n;
netread[len] = '\0';
if (n>0)
return GetLine(fd);
}
if (p!=NULL)
{
*p = '\0';
strcpy(line, netread);
/* copy rest of buf down */
memmove(netread, p+2, strlen(p+2)+1);
}
return line;
}
/**
* Send an TCP packet.
* @param data The buffer taht will be sent.
* @param size Number of bytes to send.
* return 0 if ok, -1 if error
*/
int TcpSocket::write(const void* data, int size)
{
#ifdef DUMP
TRACE_CLASS("TcpSocket", "write(const void*, int)");
#endif
// ignore BROKENPIPE signal (we handle it instead)
// void* old_sigpipe = signal ( SIGPIPE, SIG_IGN );
// try to send data
int ret = send(listenSocket, (char*)data, size, 0 /*MSG_NOSIGNAL*/ );
// restore the BROKENPIPE handling
// signal ( SIGPIPE, (__sighandler_t)old_sigpipe );
if (ret == SOCKET_ERROR) {
setInetError("Can't send TCP packet");
return -1;
}
return ret;
}
int TcpSocket::setDestination(InetAddress &addr)
{
address = addr;
int ret = connect(listenSocket, addr.getAddress(), sizeof(*addr.getAddress()));
// A etre verifier: code de retour differend entre Linux et Windows
return ret;
}
void TcpSocket::setSocket(SOCKET socket, InetAddress &addr)
{
if (listenSocket != INVALID_SOCKET)
closesocket(listenSocket);
listenSocket = socket;
address = addr;
}
InetAddress TcpSocket::getAddress()
{
return address;
}
int TcpSocket::PeekCount()
{
int count;
char tempBuffer[3];
int size=3;
count = recv(listenSocket, tempBuffer, size, MSG_PEEK);
if (count == -1)
{
printf("ERROR WHEN PEEKING SOCKET\n");
}
return count;
}
/*
WSAEINTR
WSAEBADF
WSAEACCES
WSAEFAULT
WSAEINVAL
WSAEMFILE
WSAEWOULDBLOCK
WSAEINPROGRESS
WSAEALREADY
WSAENOTSOCK
WSAEDESTADDRREQ
WSAEMSGSIZE
WSAEPROTOTYPE
WSAENOPROTOOPT
WSAEPROTONOSUPPORT
WSAESOCKTNOSUPPORT
WSAEOPNOTSUPP
WSAEPFNOSUPPORT
WSAEAFNOSUPPORT
WSAEADDRINUSE
WSAEADDRNOTAVAIL
WSAENETDOWN
WSAENETUNREACH
WSAENETRESET
WSAECONNABORTED
WSAECONNRESET
WSAENOBUFS
WSAEISCONN
WSAENOTCONN
WSAESHUTDOWN
WSAETOOMANYREFS
WSAETIMEDOUT
WSAECONNREFUSED
WSAELOOP
WSAENAMETOOLONG
WSAEHOSTDOWN
WSAEHOSTUNREACH
WSAENOTEMPTY
WSAEPROCLIM
WSAEUSERS
WSAEDQUOT
WSAESTALE
WSAEREMOTE
WSAEDISCON
WSASYSNOTREADY
WSAVERNOTSUPPORTED
WSANOTINITIALISED
*/