Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "ttcpip.h"
Toshihiro Shimizu 890ddd
#include "tconvert.h"
Toshihiro Shimizu 890ddd
Shinya Kitaoka 9f5a1b
#ifdef _WIN32
Toshihiro Shimizu 890ddd
#include <Winsock2.h>
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
#include <errno.h> /* obligatory includes */
Toshihiro Shimizu 890ddd
#include <signal.h>
Toshihiro Shimizu 890ddd
#include <stdio.h>
Toshihiro Shimizu 890ddd
#include <unistd.h>
Toshihiro Shimizu 890ddd
#include <sys/types.h>
Toshihiro Shimizu 890ddd
#include <sys/socket.h>
Toshihiro Shimizu 890ddd
#include <sys/wait.h>
Toshihiro Shimizu 890ddd
#include <netinet/in.h>
Toshihiro Shimizu 890ddd
#include <netdb.h>
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Shinya Kitaoka 9f5a1b
#ifndef _WIN32
Toshihiro Shimizu 890ddd
#define SOCKET_ERROR -1
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TTcpIpClient::TTcpIpClient()
Toshihiro Shimizu 890ddd
{
Shinya Kitaoka 9f5a1b
#ifdef _WIN32
Toshihiro Shimizu 890ddd
	WSADATA wsaData;
Toshihiro Shimizu 890ddd
	WORD wVersionRequested = MAKEWORD(1, 1);
Toshihiro Shimizu 890ddd
	int irc = WSAStartup(wVersionRequested, &wsaData);
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TTcpIpClient::~TTcpIpClient()
Toshihiro Shimizu 890ddd
{
Shinya Kitaoka 9f5a1b
#ifdef _WIN32
Toshihiro Shimizu 890ddd
	WSACleanup();
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int TTcpIpClient::connect(const QString &hostName, const QString &addrStr, int port, int &sock)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
/*
Toshihiro Shimizu 890ddd
  if (!addrStr.empty())
Toshihiro Shimizu 890ddd
  {
Toshihiro Shimizu 890ddd
    unsigned long ipAddr = inet_addr(addrStr.c_str());
Toshihiro Shimizu 890ddd
  }
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
#if QT_VERSION >= 0x050500
Toshihiro Shimizu 890ddd
	struct hostent *he = gethostbyname(hostName.toUtf8());
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
	struct hostent *he = gethostbyname(hostName.toAscii());
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
	if (!he) {
Shinya Kitaoka 9f5a1b
#ifdef _WIN32
Toshihiro Shimizu 890ddd
		int err = WSAGetLastError();
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
		return HOST_UNKNOWN;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int socket_id = socket(AF_INET, SOCK_STREAM, 0);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	struct sockaddr_in addr;
Toshihiro Shimizu 890ddd
	memset((char *)&addr, 0, sizeof addr);
Toshihiro Shimizu 890ddd
	addr.sin_family = he->h_addrtype;
Toshihiro Shimizu 890ddd
	addr.sin_port = htons(port);
Toshihiro Shimizu 890ddd
	memcpy((char *)&(addr.sin_addr), he->h_addr, he->h_length);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int rcConnect = ::connect(socket_id, (struct sockaddr *)&(addr), sizeof addr);
Toshihiro Shimizu 890ddd
	if (rcConnect == SOCKET_ERROR) {
Toshihiro Shimizu 890ddd
		sock = -1;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 9f5a1b
#ifdef _WIN32
Toshihiro Shimizu 890ddd
		int err = WSAGetLastError();
Toshihiro Shimizu 890ddd
		switch (err) {
Toshihiro Shimizu 890ddd
		case WSAECONNREFUSED:
Toshihiro Shimizu 890ddd
			err = CONNECTION_REFUSED;
Toshihiro Shimizu 890ddd
			break;
Toshihiro Shimizu 890ddd
		case WSAETIMEDOUT:
Toshihiro Shimizu 890ddd
			err = CONNECTION_TIMEDOUT;
Toshihiro Shimizu 890ddd
			break;
Toshihiro Shimizu 890ddd
		default:
Toshihiro Shimizu 890ddd
			err = CONNECTION_FAILED;
Toshihiro Shimizu 890ddd
			break;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		closesocket(socket_id);
Toshihiro Shimizu 890ddd
		return err;
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
		close(socket_id);
Toshihiro Shimizu 890ddd
		return CONNECTION_FAILED;
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	sock = socket_id;
Toshihiro Shimizu 890ddd
	return OK;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*
Shinya Kitaoka 3bfa54
int TTcpIpClient::connect(const std::string &hostName, const std::string &addrStr, int port, int &sock)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
  struct hostent *he = gethostbyname (hostName.c_str());
Toshihiro Shimizu 890ddd
  if (!he)
Toshihiro Shimizu 890ddd
  {
Shinya Kitaoka 9f5a1b
#ifdef _WIN32
Toshihiro Shimizu 890ddd
    int err = WSAGetLastError();
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
    return HOST_UNKNOWN;
Toshihiro Shimizu 890ddd
  }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  int socket_id = socket (AF_INET, SOCK_STREAM,0);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  struct sockaddr_in addr;
Toshihiro Shimizu 890ddd
  memset((char*)&addr, 0, sizeof addr);
Toshihiro Shimizu 890ddd
  addr.sin_family = he->h_addrtype;
Toshihiro Shimizu 890ddd
  addr.sin_port = htons(port);
Toshihiro Shimizu 890ddd
  memcpy((char *)&(addr.sin_addr), he->h_addr, he->h_length);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  int rcConnect = ::connect (socket_id, (struct sockaddr *)&(addr), sizeof addr);
Toshihiro Shimizu 890ddd
  if (rcConnect == SOCKET_ERROR)
Toshihiro Shimizu 890ddd
  {
Toshihiro Shimizu 890ddd
    sock = -1;
Shinya Kitaoka 9f5a1b
#ifdef _WIN32
Toshihiro Shimizu 890ddd
    int err = WSAGetLastError();
Toshihiro Shimizu 890ddd
    switch (err)
Toshihiro Shimizu 890ddd
    {
Toshihiro Shimizu 890ddd
     case WSAECONNREFUSED:
Toshihiro Shimizu 890ddd
        return CONNECTION_REFUSED;
Toshihiro Shimizu 890ddd
     case WSAETIMEDOUT:
Toshihiro Shimizu 890ddd
        return CONNECTION_TIMEDOUT;
Toshihiro Shimizu 890ddd
     default:
Toshihiro Shimizu 890ddd
        return CONNECTION_FAILED;
Toshihiro Shimizu 890ddd
    }
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
    return CONNECTION_FAILED;
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
  }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  sock = socket_id;
Toshihiro Shimizu 890ddd
  return OK;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int TTcpIpClient::disconnect(int sock)
Toshihiro Shimizu 890ddd
{
Shinya Kitaoka 9f5a1b
#ifdef _WIN32
Toshihiro Shimizu 890ddd
	closesocket(sock);
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
	close(sock);
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return OK;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int TTcpIpClient::send(int sock, const QString &data)
Toshihiro Shimizu 890ddd
{
Shinya Kitaoka 3bfa54
	std::string dataUtf8 = data.toStdString();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QString header("#$#THS01.00");
Toshihiro Shimizu 890ddd
	header += QString::number((int)dataUtf8.size());
Toshihiro Shimizu 890ddd
	header += "#$#THE";
Toshihiro Shimizu 890ddd
Shinya Kitaoka 3bfa54
	std::string packet = header.toStdString() + dataUtf8;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//  string packet = data;;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int nLeft = packet.size();
Toshihiro Shimizu 890ddd
	int idx = 0;
Toshihiro Shimizu 890ddd
	while (nLeft > 0) {
Shinya Kitaoka 9f5a1b
#ifdef _WIN32
Toshihiro Shimizu 890ddd
		int ret = ::send(sock, packet.c_str() + idx, nLeft, 0);
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
		int ret = write(sock, packet.c_str() + idx, nLeft);
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (ret == SOCKET_ERROR) {
Toshihiro Shimizu 890ddd
// Error
Shinya Kitaoka 9f5a1b
#ifdef _WIN32
Toshihiro Shimizu 890ddd
			int err = WSAGetLastError();
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
			return SEND_FAILED;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		nLeft -= ret;
Toshihiro Shimizu 890ddd
		idx += ret;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	shutdown(sock, 1);
Toshihiro Shimizu 890ddd
	return OK;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int readData(int sock, QString &data)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int cnt = 0;
Toshihiro Shimizu 890ddd
	char buff[1024];
Toshihiro Shimizu 890ddd
	memset(buff, 0, sizeof(buff));
Toshihiro Shimizu 890ddd
Shinya Kitaoka 9f5a1b
#ifdef _WIN32
Toshihiro Shimizu 890ddd
	if ((cnt = recv(sock, buff, sizeof(buff), 0)) < 0) {
Toshihiro Shimizu 890ddd
		int err = WSAGetLastError();
Toshihiro Shimizu 890ddd
		// GESTIRE L'ERRORE SPECIFICO
Toshihiro Shimizu 890ddd
		return -1;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
	if ((cnt = read(sock, buff, sizeof(buff))) < 0) {
Toshihiro Shimizu 890ddd
		printf("socket read failure %d\n", errno);
Toshihiro Shimizu 890ddd
		perror("network server");
Toshihiro Shimizu 890ddd
		close(sock);
Toshihiro Shimizu 890ddd
		return -1;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (cnt == 0)
Toshihiro Shimizu 890ddd
		return 0;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 3bfa54
	std::string aa(buff);
Toshihiro Shimizu 890ddd
	int x1 = aa.find("#$#THS01.00");
Toshihiro Shimizu 890ddd
	x1 += sizeof("#$#THS01.00") - 1;
Toshihiro Shimizu 890ddd
	int x2 = aa.find("#$#THE");
Toshihiro Shimizu 890ddd
Shinya Kitaoka 3bfa54
	std::string ssize;
Toshihiro Shimizu 890ddd
	for (int i = x1; i < x2; ++i)
Toshihiro Shimizu 890ddd
		ssize.push_back(buff[i]);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int size = toInt(ssize);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	data = QString(buff + x2 + sizeof("#$#THE") - 1);
Toshihiro Shimizu 890ddd
	size -= data.size();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	while (size > 0) {
Toshihiro Shimizu 890ddd
		memset(buff, 0, sizeof(buff));
Toshihiro Shimizu 890ddd
Shinya Kitaoka 9f5a1b
#ifdef _WIN32
Toshihiro Shimizu 890ddd
		if ((cnt = recv(sock, buff, sizeof(buff), 0)) < 0) {
Toshihiro Shimizu 890ddd
			int err = WSAGetLastError();
Toshihiro Shimizu 890ddd
			// GESTIRE L'ERRORE SPECIFICO
Toshihiro Shimizu 890ddd
			return -1;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
		if ((cnt = read(sock, buff, sizeof(buff))) < 0) {
Toshihiro Shimizu 890ddd
			printf("socket read failure %d\n", errno);
Toshihiro Shimizu 890ddd
			perror("network server");
Toshihiro Shimizu 890ddd
			close(sock);
Toshihiro Shimizu 890ddd
			return -1;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
		else if (cnt == 0) {
Toshihiro Shimizu 890ddd
			break; // break out of loop
Toshihiro Shimizu 890ddd
		} else if (cnt < (int)sizeof(buff)) {
Toshihiro Shimizu 890ddd
			data += QString(buff);
Toshihiro Shimizu 890ddd
			//break;  // break out of loop
Toshihiro Shimizu 890ddd
		} else {
Toshihiro Shimizu 890ddd
			data += QString(buff);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		size -= cnt;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (data.size() < size)
Toshihiro Shimizu 890ddd
		return -1;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return 0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#if 0
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int readData(int sock, string &data)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
  int cnt = 0;
Toshihiro Shimizu 890ddd
  char buff[1024];
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  do
Toshihiro Shimizu 890ddd
  {
Toshihiro Shimizu 890ddd
    memset (buff,0,sizeof(buff));
Toshihiro Shimizu 890ddd
Shinya Kitaoka 9f5a1b
#ifdef _WIN32
Toshihiro Shimizu 890ddd
    if (( cnt = recv(sock, buff, sizeof(buff), 0)) < 0 )
Toshihiro Shimizu 890ddd
    {
Toshihiro Shimizu 890ddd
      int err = WSAGetLastError();
Toshihiro Shimizu 890ddd
      // GESTIRE L'ERRORE SPECIFICO
Toshihiro Shimizu 890ddd
      return -1;
Toshihiro Shimizu 890ddd
    }
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
    if (( cnt = read (sock, buff, sizeof(buff))) < 0 )
Toshihiro Shimizu 890ddd
    {
Toshihiro Shimizu 890ddd
      printf("socket read failure %d\n", errno);
Toshihiro Shimizu 890ddd
      perror("network server");
Toshihiro Shimizu 890ddd
      close(sock);
Toshihiro Shimizu 890ddd
      return -1;
Toshihiro Shimizu 890ddd
    }
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
    else
Toshihiro Shimizu 890ddd
    if (cnt == 0)
Toshihiro Shimizu 890ddd
      break;  // break out of loop
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
    data += string(buff);
Toshihiro Shimizu 890ddd
  }
Toshihiro Shimizu 890ddd
  while (cnt != 0);  // do loop condition
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  return 0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//#define PRIMA
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifdef PRIMA
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int readData(int sock, string &data)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int cnt = 0;
Toshihiro Shimizu 890ddd
	char buff[1024];
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	do {
Toshihiro Shimizu 890ddd
		memset(buff, 0, sizeof(buff));
Toshihiro Shimizu 890ddd
Shinya Kitaoka 9f5a1b
#ifdef _WIN32
Toshihiro Shimizu 890ddd
		if ((cnt = recv(sock, buff, sizeof(buff), 0)) < 0) {
Toshihiro Shimizu 890ddd
			int err = WSAGetLastError();
Toshihiro Shimizu 890ddd
			// GESTIRE L'ERRORE SPECIFICO
Toshihiro Shimizu 890ddd
			return -1;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
		if ((cnt = read(sock, buff, sizeof(buff))) < 0) {
Toshihiro Shimizu 890ddd
			printf("socket read failure %d\n", errno);
Toshihiro Shimizu 890ddd
			perror("network server");
Toshihiro Shimizu 890ddd
			close(sock);
Toshihiro Shimizu 890ddd
			return -1;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
		else if (cnt == 0) {
Toshihiro Shimizu 890ddd
			break; // break out of loop
Toshihiro Shimizu 890ddd
		} else if (cnt < sizeof(buff)) {
Toshihiro Shimizu 890ddd
			data += string(buff);
Toshihiro Shimizu 890ddd
			//break;  // break out of loop
Toshihiro Shimizu 890ddd
		} else {
Toshihiro Shimizu 890ddd
			data += string(buff);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	} while (cnt != 0); // do loop condition
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return 0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
int TTcpIpClient::send(int sock, const QString &data, QString &reply)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (data.size() > 0) {
Toshihiro Shimizu 890ddd
		int ret = send(sock, data);
Toshihiro Shimizu 890ddd
		if (ret == 0)
Toshihiro Shimizu 890ddd
			ret = readData(sock, reply);
Toshihiro Shimizu 890ddd
		return ret;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return OK;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*
Shinya Kitaoka 3bfa54
int TTcpIpClient::send(int sock, const std::string &data, string &reply)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
  int ret = send(sock, data);
Toshihiro Shimizu 890ddd
  if (ret == 0)
Toshihiro Shimizu 890ddd
    ret = readData(sock, reply);
Toshihiro Shimizu 890ddd
  return ret;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
*/