connectivity/com.nokia.tcf/native/TCFNative/TCFCommTCP/TcpComm.cpp
author chpeckha
Mon, 06 Apr 2009 15:18:48 -0500
changeset 60 9d2210c8eed2
child 366 b054461d2f85
permissions -rw-r--r--
Commit changes for 2.1.0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
60
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
     1
/*
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
     2
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
     3
* All rights reserved.
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
     4
* This component and the accompanying materials are made available
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
     5
* under the terms of the License "Eclipse Public License v1.0"
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
     6
* which accompanies this distribution, and is available
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
     8
*
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
     9
* Initial Contributors:
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    11
*
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    12
* Contributors:
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    13
*
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    14
* Description: 
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    15
*
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    16
*/
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    17
// TcpComm.cpp: implementation of the CTcpComm class.
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    18
//
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    19
//////////////////////////////////////////////////////////////////////
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    20
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    21
#include "stdafx.h"
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    22
#include "TcpComm.h"
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    23
//#include "pn_const.h"
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    24
//#include "OSTConstants.h"
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    25
#include "Connection.h"
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    26
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    27
#ifdef _DEBUG
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    28
static char sTcpLogMsg[3000];
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    29
#endif
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    30
//////////////////////////////////////////////////////////////////////
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    31
// Construction/Destruction
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    32
//////////////////////////////////////////////////////////////////////
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    33
CTcpComm::CTcpComm()
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    34
{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    35
#ifdef _DEBUG
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    36
	if (gDoLogging)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    37
	{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    38
		FILE* f = fopen("c:\\tcf\\tcpcommlog.txt", "at");
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    39
		fprintf(f, "CTcpComm::CTcpComm() (default constructor)\n");
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    40
		fclose(f);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    41
	}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    42
#endif
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    43
	m_socket = INVALID_SOCKET;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    44
	m_timeOut.tv_sec = TIMEOUT_SEC(DEFAULT_SOCKET_TIMEOUT);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    45
	m_timeOut.tv_usec = TIMEOUT_USEC(DEFAULT_SOCKET_TIMEOUT);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    46
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    47
	m_hSocketEvent = WSA_INVALID_EVENT;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    48
}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    49
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    50
CTcpComm::CTcpComm(ConnectData* connectSettings, DWORD connectionId, CBaseProtocol* protocol)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    51
{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    52
#ifdef _DEBUG
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    53
	if (gDoLogging)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    54
	{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    55
		FILE* f = fopen("c:\\tcf\\tcpcommlog.txt", "at");
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    56
		fprintf(f, "connectSettings=%x connectionId=%d, protocol=%x\n", connectSettings, connectionId, protocol);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    57
		fclose(f);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    58
	}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    59
#endif
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    60
	m_connId = connectionId;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    61
	m_Protocol = protocol;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    62
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    63
	m_ConnectSettings = new ConnectData();
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    64
	memcpy(m_ConnectSettings, connectSettings, sizeof(ConnectData));
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    65
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    66
#if (defined(LOG_COMM) || defined(LOG_PROCCOMM)) && defined(_DEBUG)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    67
	if (gDoLogging)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    68
	{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    69
		m_CommDebugLog = new TCDebugLog("TCF_Comm", connectionId, 2000L);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    70
		m_ProcDebugLog = new TCDebugLog("TCF_CommP", connectionId, 2000L);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    71
	}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    72
#endif
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    73
	m_socket = INVALID_SOCKET;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    74
	m_timeOut.tv_sec = TIMEOUT_SEC(DEFAULT_SOCKET_TIMEOUT);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    75
	m_timeOut.tv_usec = TIMEOUT_USEC(DEFAULT_SOCKET_TIMEOUT);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    76
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    77
	m_hSocketEvent = WSA_INVALID_EVENT;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    78
}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    79
CTcpComm::~CTcpComm()
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    80
{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    81
#ifdef _DEBUG
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    82
	if (gDoLogging)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    83
	{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    84
		FILE* f = fopen("c:\\tcf\\tcpcommlog.txt", "at");
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    85
		fprintf(f, "CTcpComm::~CTcpComm()\n");
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    86
		fclose(f);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    87
	}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    88
#endif
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    89
	if (IsConnected())
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    90
	{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    91
		shutdown(m_socket, SD_BOTH);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    92
		closesocket(m_socket);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    93
		WSACleanup();
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    94
	}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    95
	if (m_pBuffer)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    96
		delete[] m_pBuffer;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    97
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    98
	if (m_hSocketEvent != WSA_INVALID_EVENT)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
    99
		WSACloseEvent(m_hSocketEvent);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   100
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   101
}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   102
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   103
//#define USE_EVENTS
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   104
;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   105
long CTcpComm::OpenPort()
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   106
{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   107
	COMMLOGOPEN();
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   108
	COMMLOGS("CTcpComm::OpenPort\n");
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   109
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   110
	long err = TCAPI_ERR_NONE;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   111
	char* ipAddress = m_ConnectSettings->tcpSettings.ipAddress;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   112
	char* ipPort = m_ConnectSettings->tcpSettings.ipPort;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   113
	// set this to set socket to non-blocking
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   114
	// DWORD nonblock = 1;		// non-blocking
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   115
	DWORD nonblock = 0;		// blocking
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   116
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   117
	COMMLOGA2("CTcpComm::OpenPort ipAddress=%s ipPort=%s\n", ipAddress, ipPort);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   118
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   119
	WSADATA wsaData;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   120
	int wsaErr = WSAStartup(MAKEWORD(2,2), &wsaData);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   121
	if (wsaErr != 0)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   122
	{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   123
		err = TCAPI_ERR_WHILE_CONFIGURING_MEDIA;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   124
//		err = -1;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   125
	}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   126
	else
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   127
	{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   128
		m_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   129
		if (m_socket == INVALID_SOCKET)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   130
		{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   131
			m_lastCommError = WSAGetLastError();
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   132
			WSACleanup();
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   133
			err = TCAPI_ERR_WHILE_CONFIGURING_MEDIA;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   134
		}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   135
		else
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   136
		{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   137
			if (ioctlsocket(m_socket, FIONBIO, &nonblock) == SOCKET_ERROR)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   138
			{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   139
				m_lastCommError = WSAGetLastError();
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   140
				closesocket(m_socket);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   141
				m_socket = INVALID_SOCKET;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   142
				WSACleanup();
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   143
				err = TCAPI_ERR_WHILE_CONFIGURING_MEDIA;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   144
			}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   145
			else
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   146
			{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   147
				int i = SO_MAX_MSG_SIZE;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   148
				// set socket options
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   149
				BOOL keepAlive = TRUE;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   150
				setsockopt(m_socket, SOL_SOCKET, SO_KEEPALIVE, (const char*)&keepAlive, sizeof(BOOL));
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   151
				int sockRecvSize = MAX_TCP_MESSAGE_BUFFER_LENGTH;//(256*1024L);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   152
				setsockopt(m_socket, SOL_SOCKET, SO_RCVBUF, (const char*)&sockRecvSize, sizeof(int));
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   153
				int sockSendSize = (64*1024L);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   154
				setsockopt(m_socket, SOL_SOCKET, SO_SNDBUF, (const char*)&sockSendSize, sizeof(int));
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   155
				WSAGetLastError(); // ignore error for now
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   156
				int gotsockRecvSize, optLen=sizeof(int);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   157
				getsockopt(m_socket, SOL_SOCKET, SO_RCVBUF, (char*)&gotsockRecvSize, &optLen);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   158
				WSAGetLastError(); // ignore error for now
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   159
				// connect
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   160
				WORD wPort = atoi(ipPort);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   161
				m_clientService.sin_family = AF_INET;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   162
				m_clientService.sin_addr.S_un.S_addr = inet_addr(ipAddress);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   163
				m_clientService.sin_port = htons(wPort);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   164
				if (connect(m_socket, (SOCKADDR*)&m_clientService, sizeof(m_clientService)) == SOCKET_ERROR)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   165
				{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   166
					int wsaErr = WSAGetLastError();
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   167
					// socket is non-blocking
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   168
					if (wsaErr != WSAEWOULDBLOCK)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   169
					{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   170
						m_lastCommError = wsaErr;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   171
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   172
						closesocket(m_socket);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   173
						m_socket = INVALID_SOCKET;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   174
						WSACleanup();
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   175
						err = TCAPI_ERR_WHILE_CONFIGURING_MEDIA;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   176
					}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   177
					else // WSAEWOULDBLOCK error returned
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   178
					{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   179
						// WSAEWOULDBLOCK use select now
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   180
						fd_set readfds, writefds, exceptfds;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   181
						FD_ZERO(&readfds);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   182
						FD_ZERO(&writefds);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   183
						FD_ZERO(&exceptfds);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   184
						FD_SET(m_socket, &readfds);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   185
						FD_SET(m_socket, &writefds);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   186
						FD_SET(m_socket, &exceptfds);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   187
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   188
						int selRes = 0;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   189
						while(1)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   190
						{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   191
							selRes = select(0, &readfds, &writefds, &exceptfds, &m_timeOut);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   192
							if (selRes == SOCKET_ERROR)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   193
							{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   194
								wsaErr = WSAGetLastError();
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   195
								if (wsaErr != WSAEWOULDBLOCK)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   196
								{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   197
									// real error
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   198
									m_lastCommError = wsaErr;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   199
									shutdown(m_socket, SD_BOTH);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   200
									closesocket(m_socket);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   201
									m_socket = INVALID_SOCKET;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   202
									WSACleanup();
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   203
									err = TCAPI_ERR_WHILE_CONFIGURING_MEDIA;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   204
								}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   205
								// else do another select
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   206
							}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   207
							else if (selRes > 0)// select OK 
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   208
							{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   209
								m_lastCommError = 0;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   210
								m_isConnected = true;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   211
								break; // done
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   212
							}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   213
							else
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   214
							{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   215
								// timed out
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   216
								m_lastCommError = WSAGetLastError();
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   217
								shutdown(m_socket, SD_BOTH);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   218
								closesocket(m_socket);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   219
								m_socket = INVALID_SOCKET;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   220
								WSACleanup();
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   221
								err = TCAPI_ERR_WHILE_CONFIGURING_MEDIA;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   222
							}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   223
						}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   224
					}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   225
				}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   226
				else // connect return OK
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   227
				{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   228
					m_lastCommError = 0;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   229
					m_isConnected = true;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   230
				}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   231
			}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   232
		}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   233
	}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   234
	if (err == TCAPI_ERR_NONE)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   235
	{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   236
		// we are connected
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   237
		m_numberBytes = 0;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   238
		m_pBuffer = new BYTE[MAX_TCP_MESSAGE_BUFFER_LENGTH];
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   239
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   240
#ifdef USE_EVENTS
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   241
		// create an event for the socket closing
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   242
		m_hSocketEvent = WSACreateEvent();
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   243
		::WSAEventSelect(m_socket, m_hSocketEvent, FD_CLOSE);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   244
		// above call sets socket to non-blocking
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   245
		//  cannot reset to blocking after using WSAEventSelect
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   246
		//  thus this ioctlsocket call will fail
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   247
		ioctlsocket(m_socket, FIONBIO, &nonblock);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   248
#endif
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   249
	}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   250
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   251
	COMMLOGCLOSE();
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   252
	return err;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   253
}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   254
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   255
long CTcpComm::ClosePort()
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   256
{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   257
	COMMLOGOPEN();
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   258
	COMMLOGS("CTcpComm::ClosePort\n");
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   259
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   260
	long err = TCAPI_ERR_NONE;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   261
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   262
	if (!IsConnected())
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   263
	{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   264
		err = TCAPI_ERR_MEDIA_NOT_OPEN;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   265
	}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   266
	else
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   267
	{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   268
		shutdown(m_socket, SD_BOTH);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   269
		closesocket(m_socket);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   270
		m_socket = INVALID_SOCKET;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   271
		WSACleanup();
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   272
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   273
		delete[] m_pBuffer;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   274
		m_pBuffer = NULL;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   275
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   276
		if (m_hSocketEvent != WSA_INVALID_EVENT)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   277
		{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   278
			WSACloseEvent(m_hSocketEvent);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   279
			m_hSocketEvent = WSA_INVALID_EVENT;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   280
		}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   281
	}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   282
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   283
	COMMLOGCLOSE();
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   284
	return err;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   285
}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   286
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   287
long CTcpComm::PollPort(DWORD &outSize)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   288
{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   289
	long err = TCAPI_ERR_NONE;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   290
	DWORD numBytes = 0;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   291
	outSize = 0;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   292
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   293
	if (!IsConnected())
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   294
		return TCAPI_ERR_MEDIA_NOT_OPEN;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   295
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   296
#ifdef USE_EVENTS
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   297
	int ret = ::WSAWaitForMultipleEvents(1, &m_hSocketEvent, FALSE, 0, FALSE);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   298
	if (ret == WSA_WAIT_EVENT_0)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   299
	{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   300
		::WSAResetEvent(m_hSocketEvent);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   301
		err = TCAPI_ERR_COMM_ERROR;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   302
		m_lastCommError = WSAESHUTDOWN;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   303
		return err;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   304
	}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   305
#endif
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   306
	int sockErr = 0; int optLen = sizeof(int);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   307
	int getErr = getsockopt(m_socket, SOL_SOCKET, SO_ERROR, (char*)&sockErr, &optLen);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   308
	if (getErr == 0)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   309
	{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   310
		if (sockErr)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   311
		{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   312
			err = TCAPI_ERR_COMM_ERROR;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   313
			m_lastCommError = sockErr;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   314
			return err;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   315
		}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   316
	}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   317
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   318
	fd_set readfds, writefds, exceptfds;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   319
	FD_ZERO(&readfds); 
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   320
	FD_ZERO(&writefds); 
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   321
	FD_ZERO(&exceptfds);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   322
	FD_SET(m_socket, &readfds);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   323
	FD_SET(m_socket, &writefds);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   324
	FD_SET(m_socket, &exceptfds);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   325
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   326
	bool portReady = false;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   327
	{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   328
		TIMEVAL pollTimeout = {0,0}; // just poll the status
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   329
		int selErr = select(0, &readfds, 0, 0, &pollTimeout);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   330
		if (selErr > 0)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   331
		{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   332
			if (FD_ISSET(m_socket, &readfds))
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   333
			{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   334
				m_lastCommError = 0;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   335
				portReady = true;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   336
			}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   337
		}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   338
		else if (selErr == SOCKET_ERROR)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   339
		{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   340
			m_lastCommError = WSAGetLastError();
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   341
			err = TCAPI_ERR_COMM_ERROR;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   342
		}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   343
	}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   344
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   345
	if (portReady)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   346
	{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   347
		// read was signaled as ready
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   348
		int recvRet = recv(m_socket, (char*)&m_pPeekBuffer, sizeof(m_pPeekBuffer), MSG_PEEK);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   349
		if (recvRet > 0)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   350
		{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   351
			if (ioctlsocket(m_socket, FIONREAD, &numBytes) == 0)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   352
			{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   353
				m_lastCommError = 0;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   354
				outSize = numBytes;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   355
			}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   356
			else // SOCKET_ERROR
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   357
			{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   358
				m_lastCommError = WSAGetLastError();
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   359
				err = TCAPI_ERR_COMM_ERROR;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   360
			}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   361
		}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   362
		else if (recvRet == 0)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   363
		{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   364
			// read was signalled as ready but recv=0 signals that remote shutdown
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   365
			m_lastCommError = WSAESHUTDOWN;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   366
			err = TCAPI_ERR_COMM_ERROR;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   367
		}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   368
		else
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   369
		{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   370
			// SOCKET_ERROR: error on recv other than a shutdown
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   371
			m_lastCommError = WSAGetLastError();
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   372
			err = TCAPI_ERR_COMM_ERROR;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   373
		}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   374
	}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   375
	return err;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   376
}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   377
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   378
long CTcpComm::ReadPort(DWORD inSize, void *outData, DWORD &outSize)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   379
{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   380
	long err = TCAPI_ERR_NONE;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   381
	DWORD numBytes = 0;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   382
	outSize = 0;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   383
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   384
	if (!IsConnected())
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   385
		return TCAPI_ERR_MEDIA_NOT_OPEN;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   386
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   387
	if (ioctlsocket(m_socket, FIONREAD, &numBytes) == 0)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   388
	{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   389
		if (numBytes > inSize)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   390
			numBytes = inSize;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   391
		int res = recv(m_socket, (char*)outData, numBytes, 0);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   392
		if (res == SOCKET_ERROR)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   393
		{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   394
			long commErr = WSAGetLastError();
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   395
			if ((DWORD)commErr != m_lastCommError)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   396
			{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   397
				m_lastCommError = commErr;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   398
			}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   399
			err = TCAPI_ERR_COMM_ERROR;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   400
		}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   401
		else if (res == 0)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   402
		{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   403
			// recv=0 --> connection closed
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   404
			m_lastCommError = WSAESHUTDOWN;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   405
			err = TCAPI_ERR_COMM_ERROR;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   406
		}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   407
		else
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   408
		{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   409
			m_lastCommError = 0;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   410
			outSize = numBytes;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   411
		}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   412
	}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   413
	else
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   414
	{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   415
		// SOCKET_ERROR on ioctlsocket
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   416
		m_lastCommError = WSAGetLastError();
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   417
		err = TCAPI_ERR_COMM_ERROR;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   418
	}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   419
	return err;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   420
}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   421
long CTcpComm::ProcessBuffer(CConnection* pConn, CRegistry* pRegistry, long& numberProcessed)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   422
{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   423
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   424
	long err = TCAPI_ERR_NONE;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   425
	long routingErr = TCAPI_ERR_NONE;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   426
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   427
	if (!IsConnected())
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   428
		return TCAPI_ERR_MEDIA_NOT_OPEN;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   429
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   430
	if (!m_Protocol)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   431
		return TCAPI_ERR_UNKNOWN_MEDIA_TYPE;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   432
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   433
	DWORD protocolHeaderLength = m_Protocol->GetHeaderLength();
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   434
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   435
	// fill buffer
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   436
	if (m_numberBytes < MAX_TCP_MESSAGE_BUFFER_LENGTH)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   437
	{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   438
		DWORD outLen = MAX_TCP_MESSAGE_BUFFER_LENGTH - m_numberBytes;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   439
		BYTE* ptr = &m_pBuffer[m_numberBytes];
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   440
		err = ReadPort(outLen, ptr, outLen);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   441
		if (err == TCAPI_ERR_NONE && outLen > 0)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   442
		{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   443
			m_numberBytes += outLen;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   444
		}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   445
	}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   446
	
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   447
	// now process buffer but only for complete messages
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   448
	if (err == TCAPI_ERR_NONE)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   449
	{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   450
		if (m_numberBytes >= protocolHeaderLength)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   451
		{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   452
			BYTE* ptr = m_pBuffer;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   453
			long bytesRemaining = m_numberBytes;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   454
			long usedLen = 0;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   455
			bool done = false;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   456
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   457
			while (!done)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   458
			{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   459
				DWORD fullMessageLength = bytesRemaining;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   460
				DWORD rawLength = 0;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   461
				BYTE* fullMessage = ptr;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   462
				BYTE* rawMessage = ptr;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   463
				BYTE msgId = 0;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   464
				if (m_Protocol->DecodeMessage(fullMessage, fullMessageLength, msgId, rawMessage, rawLength))
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   465
				{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   466
					err = PreProcessMessage(msgId, fullMessageLength, fullMessage);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   467
					if (err != TCAPI_ERR_NONE)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   468
					{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   469
						PROCLOGOPEN();
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   470
						PROCLOGA1("CTcpComm::ProcessBuffer Notify err = %x\n", err);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   471
						PROCLOGCLOSE();
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   472
						// notify all clients right now 
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   473
						pConn->NotifyClientsCommError(err, false, 0);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   474
						err = TCAPI_ERR_NONE;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   475
					}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   476
#ifdef _DEBUG
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   477
					int reallen = fullMessageLength;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   478
					if (reallen > 50) reallen = 50;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   479
					char msg[6];
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   480
					msg[0] = '\0';
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   481
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   482
					sTcpLogMsg[0] = '\0';
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   483
					if (reallen > 0)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   484
					{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   485
						sTcpLogMsg[0] = '\0';
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   486
						for (int i = 0; i < reallen; i++)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   487
						{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   488
							sprintf(msg, "%02.2x ", ptr[i]);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   489
							strcat(sTcpLogMsg, msg);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   490
						}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   491
					}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   492
#endif
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   493
					PROCLOGOPEN();
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   494
					PROCLOGA5("CTcpComm::ProcessBuffer - RouteMesssage pRegistry = %x id=%x len=%d len=%d\n  msg=%s\n", pRegistry, msgId, fullMessageLength, rawLength, sTcpLogMsg);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   495
					PROCLOGCLOSE();
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   496
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   497
					err = pRegistry->RouteMessage(msgId, fullMessage, fullMessageLength, rawMessage, rawLength);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   498
					if (err != TCAPI_ERR_NONE) routingErr = err; // saved for future
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   499
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   500
					numberProcessed++;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   501
					usedLen += fullMessageLength;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   502
					bytesRemaining -= fullMessageLength;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   503
					ptr += fullMessageLength;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   504
					if (bytesRemaining < protocolHeaderLength)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   505
						done = true;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   506
				}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   507
				else
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   508
				{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   509
					done = true;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   510
				}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   511
			}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   512
			DeleteMsg(usedLen);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   513
		}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   514
	}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   515
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   516
	if (routingErr == TCAPI_ERR_NONE)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   517
		return err;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   518
	else
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   519
		return routingErr;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   520
}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   521
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   522
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   523
long CTcpComm::SendDataToPort(DWORD inSize, const void* inData)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   524
{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   525
	COMMLOGOPEN();
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   526
	COMMLOGS("CTcpComm::SendDataToPort\n");
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   527
	
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   528
	long err = TCAPI_ERR_NONE;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   529
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   530
	if (!IsConnected())
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   531
	{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   532
		COMMLOGCLOSE();
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   533
		return TCAPI_ERR_MEDIA_NOT_OPEN;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   534
	}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   535
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   536
#ifdef USE_EVENTS
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   537
	int ret = ::WSAWaitForMultipleEvents(1, &m_hSocketEvent, FALSE, 0, FALSE);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   538
	if (ret == WSA_WAIT_EVENT_0)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   539
	{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   540
		::WSAResetEvent(m_hSocketEvent);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   541
		err = TCAPI_ERR_COMM_ERROR;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   542
		m_lastCommError = WSAESHUTDOWN;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   543
		COMMLOGCLOSE();
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   544
		return err;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   545
	}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   546
#endif
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   547
	int sockErr = 0; int optLen = sizeof(int);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   548
	int getErr = getsockopt(m_socket, SOL_SOCKET, SO_ERROR, (char*)&sockErr, &optLen);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   549
	if (getErr == 0)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   550
	{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   551
		if (sockErr)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   552
		{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   553
			err = TCAPI_ERR_COMM_ERROR;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   554
			m_lastCommError = sockErr;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   555
			COMMLOGCLOSE();
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   556
			return err;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   557
		}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   558
	}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   559
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   560
	fd_set readfds, writefds, exceptfds;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   561
	FD_ZERO(&readfds); 
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   562
	FD_ZERO(&writefds); 
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   563
	FD_ZERO(&exceptfds);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   564
	FD_SET(m_socket, &readfds);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   565
	FD_SET(m_socket, &writefds);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   566
	FD_SET(m_socket, &exceptfds);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   567
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   568
	COMMLOGS("CTcpComm::SendDataToPort select\n");
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   569
	bool portReady = false;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   570
	{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   571
		int selErr = select(0, &readfds, &writefds, &exceptfds, &m_timeOut);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   572
		if (selErr > 0)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   573
		{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   574
			if (FD_ISSET(m_socket, &writefds))
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   575
			{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   576
				m_lastCommError = 0;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   577
				portReady = true;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   578
			}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   579
		}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   580
		else if (selErr == SOCKET_ERROR)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   581
		{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   582
			m_lastCommError = WSAGetLastError();
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   583
			err = TCAPI_ERR_COMM_ERROR;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   584
		}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   585
		else if (selErr == 0) // timeout
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   586
		{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   587
			m_lastCommError = WSAGetLastError();
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   588
			err = TCAPI_ERR_COMM_ERROR;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   589
		}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   590
	}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   591
	COMMLOGA1("CTcpComm::SendDataToPort portReady=%d\n", portReady);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   592
	if (portReady)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   593
	{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   594
		COMMLOGS("CTcpComm::SendDataToPort send start\n");
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   595
		// loop until all bytes are sent
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   596
		DWORD bytesRemaining = inSize;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   597
		DWORD nSent = 0;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   598
		char* unsent = (char*)inData;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   599
		while (bytesRemaining)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   600
		{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   601
			nSent = send(m_socket, unsent, bytesRemaining, 0);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   602
			if (nSent == SOCKET_ERROR)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   603
			{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   604
				int wsaErr = WSAGetLastError();
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   605
				// ignore "would block" errors
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   606
				if (wsaErr != WSAEWOULDBLOCK)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   607
				{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   608
					// TODO: error handling
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   609
					m_lastCommError = wsaErr;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   610
					err = TCAPI_ERR_COMM_ERROR;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   611
					break;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   612
				}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   613
			}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   614
			else
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   615
			{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   616
				m_lastCommError = 0;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   617
				unsent += nSent;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   618
				bytesRemaining -= nSent;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   619
			}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   620
		} // end while
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   621
		COMMLOGS("CTcpComm::SendDataToPort send done\n");
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   622
#ifdef _DEBUG
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   623
		BYTE* ptr = (BYTE*)inData;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   624
		long numBytes = (inSize > 20) ? 20 : inSize;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   625
		char msg[200];
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   626
		sprintf(msg, "CTcpComm::SendDataToPort data = ");
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   627
		for (int i = 0; i < numBytes; i++)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   628
		{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   629
			sprintf(msg, "%s %02.2x", msg, ptr[i]);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   630
		}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   631
		sprintf(msg, "%s\n", msg);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   632
		COMMLOGS(msg);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   633
#endif
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   634
	}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   635
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   636
	COMMLOGCLOSE();
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   637
	return err;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   638
}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   639
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   640
void CTcpComm::DeleteMsg(DWORD inMsgLength)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   641
{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   642
	// inMsgLength includes header
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   643
	// delete from beginning of buffer
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   644
	if (inMsgLength == 0)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   645
		return;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   646
	if (m_numberBytes > 0 && m_numberBytes >= inMsgLength)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   647
	{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   648
		size_t moveLen = m_numberBytes - inMsgLength;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   649
		if (moveLen > 0)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   650
			memcpy(&m_pBuffer[0], &m_pBuffer[inMsgLength], moveLen);
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   651
		m_numberBytes -= inMsgLength;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   652
	}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   653
}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   654
bool CTcpComm::IsConnectionEqual(ConnectData* pConn)
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   655
{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   656
	if ((strcmp(pConn->tcpSettings.ipAddress, m_ConnectSettings->tcpSettings.ipAddress) == 0) &&
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   657
		(strcmp(pConn->tcpSettings.ipPort, m_ConnectSettings->tcpSettings.ipPort) == 0))
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   658
	{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   659
		return true;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   660
	}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   661
	else
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   662
	{
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   663
		return false;
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   664
	}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   665
}
9d2210c8eed2 Commit changes for 2.1.0
chpeckha
parents:
diff changeset
   666