--- a/connectivity/com.nokia.tcf/native/TCFNative/TCFCommTCP/TcpComm.cpp Thu Jul 16 09:39:55 2009 -0500
+++ b/connectivity/com.nokia.tcf/native/TCFNative/TCFCommTCP/TcpComm.cpp Wed Jul 22 12:14:43 2009 -0500
@@ -24,9 +24,6 @@
//#include "OSTConstants.h"
#include "Connection.h"
-#ifdef _DEBUG
-static char sTcpLogMsg[3000];
-#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
@@ -35,9 +32,9 @@
#ifdef _DEBUG
if (gDoLogging)
{
- FILE* f = fopen("c:\\tcf\\tcpcommlog.txt", "at");
- fprintf(f, "CTcpComm::CTcpComm() (default constructor)\n");
- fclose(f);
+// FILE* f = fopen("c:\\tcf\\tcpcommlog.txt", "at");
+// fprintf(f, "CTcpComm::CTcpComm() (default constructor)\n");
+// fclose(f);
}
#endif
m_socket = INVALID_SOCKET;
@@ -45,6 +42,7 @@
m_timeOut.tv_usec = TIMEOUT_USEC(DEFAULT_SOCKET_TIMEOUT);
m_hSocketEvent = WSA_INVALID_EVENT;
+
}
CTcpComm::CTcpComm(ConnectData* connectSettings, DWORD connectionId, CBaseProtocol* protocol)
@@ -52,9 +50,9 @@
#ifdef _DEBUG
if (gDoLogging)
{
- FILE* f = fopen("c:\\tcf\\tcpcommlog.txt", "at");
- fprintf(f, "connectSettings=%x connectionId=%d, protocol=%x\n", connectSettings, connectionId, protocol);
- fclose(f);
+// FILE* f = fopen("c:\\tcf\\tcpcommlog.txt", "at");
+// fprintf(f, "connectSettings=%x connectionId=%d, protocol=%x\n", connectSettings, connectionId, protocol);
+// fclose(f);
}
#endif
m_connId = connectionId;
@@ -75,22 +73,27 @@
m_timeOut.tv_usec = TIMEOUT_USEC(DEFAULT_SOCKET_TIMEOUT);
m_hSocketEvent = WSA_INVALID_EVENT;
+
}
CTcpComm::~CTcpComm()
{
#ifdef _DEBUG
if (gDoLogging)
{
- FILE* f = fopen("c:\\tcf\\tcpcommlog.txt", "at");
- fprintf(f, "CTcpComm::~CTcpComm()\n");
- fclose(f);
+// FILE* f = fopen("c:\\tcf\\tcpcommlog.txt", "at");
+// fprintf(f, "CTcpComm::~CTcpComm()\n");
+// fclose(f);
}
#endif
if (IsConnected())
{
- shutdown(m_socket, SD_BOTH);
- closesocket(m_socket);
- WSACleanup();
+ if (m_socket != INVALID_SOCKET)
+ {
+ shutdown(m_socket, SD_BOTH);
+ closesocket(m_socket);
+ WSAClose();
+ }
+ m_isConnected = false;
}
if (m_pBuffer)
delete[] m_pBuffer;
@@ -116,8 +119,8 @@
COMMLOGA2("CTcpComm::OpenPort ipAddress=%s ipPort=%s\n", ipAddress, ipPort);
- WSADATA wsaData;
- int wsaErr = WSAStartup(MAKEWORD(2,2), &wsaData);
+ int wsaErr = 0;
+ wsaErr = WSAInit();
if (wsaErr != 0)
{
err = TCAPI_ERR_WHILE_CONFIGURING_MEDIA;
@@ -126,10 +129,12 @@
else
{
m_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+ COMMLOGA1("CTcpComm::OpenPort socket=%x\n", m_socket);
if (m_socket == INVALID_SOCKET)
{
m_lastCommError = WSAGetLastError();
- WSACleanup();
+ WSASetLastError(0);
+ WSAClose();
err = TCAPI_ERR_WHILE_CONFIGURING_MEDIA;
}
else
@@ -137,25 +142,30 @@
if (ioctlsocket(m_socket, FIONBIO, &nonblock) == SOCKET_ERROR)
{
m_lastCommError = WSAGetLastError();
+ WSASetLastError(0);
closesocket(m_socket);
m_socket = INVALID_SOCKET;
- WSACleanup();
+ WSAClose();
err = TCAPI_ERR_WHILE_CONFIGURING_MEDIA;
}
else
{
int i = SO_MAX_MSG_SIZE;
// set socket options
- BOOL keepAlive = TRUE;
+ BOOL keepAlive = FALSE;
setsockopt(m_socket, SOL_SOCKET, SO_KEEPALIVE, (const char*)&keepAlive, sizeof(BOOL));
+
+ struct linger l;
+ l.l_onoff = 0; l.l_linger = 0;
+ setsockopt(m_socket, SOL_SOCKET, SO_LINGER, (const char*)&l, sizeof(l));
+
int sockRecvSize = MAX_TCP_MESSAGE_BUFFER_LENGTH;//(256*1024L);
setsockopt(m_socket, SOL_SOCKET, SO_RCVBUF, (const char*)&sockRecvSize, sizeof(int));
int sockSendSize = (64*1024L);
setsockopt(m_socket, SOL_SOCKET, SO_SNDBUF, (const char*)&sockSendSize, sizeof(int));
WSAGetLastError(); // ignore error for now
- int gotsockRecvSize, optLen=sizeof(int);
- getsockopt(m_socket, SOL_SOCKET, SO_RCVBUF, (char*)&gotsockRecvSize, &optLen);
- WSAGetLastError(); // ignore error for now
+ WSASetLastError(0);
+
// connect
WORD wPort = atoi(ipPort);
m_clientService.sin_family = AF_INET;
@@ -164,6 +174,9 @@
if (connect(m_socket, (SOCKADDR*)&m_clientService, sizeof(m_clientService)) == SOCKET_ERROR)
{
int wsaErr = WSAGetLastError();
+ WSASetLastError(0);
+ COMMLOGA1("CTcpComm::OpenPort connect=wsaErr=%d\n", wsaErr);
+
// socket is non-blocking
if (wsaErr != WSAEWOULDBLOCK)
{
@@ -171,7 +184,7 @@
closesocket(m_socket);
m_socket = INVALID_SOCKET;
- WSACleanup();
+ WSAClose();
err = TCAPI_ERR_WHILE_CONFIGURING_MEDIA;
}
else // WSAEWOULDBLOCK error returned
@@ -192,6 +205,7 @@
if (selRes == SOCKET_ERROR)
{
wsaErr = WSAGetLastError();
+ WSASetLastError(0);
if (wsaErr != WSAEWOULDBLOCK)
{
// real error
@@ -199,7 +213,7 @@
shutdown(m_socket, SD_BOTH);
closesocket(m_socket);
m_socket = INVALID_SOCKET;
- WSACleanup();
+ WSAClose();
err = TCAPI_ERR_WHILE_CONFIGURING_MEDIA;
}
// else do another select
@@ -214,10 +228,11 @@
{
// timed out
m_lastCommError = WSAGetLastError();
+ WSASetLastError(0);
shutdown(m_socket, SD_BOTH);
closesocket(m_socket);
m_socket = INVALID_SOCKET;
- WSACleanup();
+ WSAClose();
err = TCAPI_ERR_WHILE_CONFIGURING_MEDIA;
}
}
@@ -225,6 +240,7 @@
}
else // connect return OK
{
+ COMMLOGS("CTcpComm::OpenPort connect OK\n");
m_lastCommError = 0;
m_isConnected = true;
}
@@ -248,6 +264,7 @@
#endif
}
+ COMMLOGA1("CTcpComm::OpenPort err=%d\n", err);
COMMLOGCLOSE();
return err;
}
@@ -265,10 +282,15 @@
}
else
{
- shutdown(m_socket, SD_BOTH);
- closesocket(m_socket);
- m_socket = INVALID_SOCKET;
- WSACleanup();
+ if (m_socket != INVALID_SOCKET)
+ {
+ shutdown(m_socket, SD_BOTH);
+ closesocket(m_socket);
+ m_socket = INVALID_SOCKET;
+
+ WSAClose();
+ }
+ m_isConnected = false;
delete[] m_pBuffer;
m_pBuffer = NULL;
@@ -338,6 +360,7 @@
else if (selErr == SOCKET_ERROR)
{
m_lastCommError = WSAGetLastError();
+ WSASetLastError(0);
err = TCAPI_ERR_COMM_ERROR;
}
}
@@ -356,6 +379,7 @@
else // SOCKET_ERROR
{
m_lastCommError = WSAGetLastError();
+ WSASetLastError(0);
err = TCAPI_ERR_COMM_ERROR;
}
}
@@ -369,6 +393,7 @@
{
// SOCKET_ERROR: error on recv other than a shutdown
m_lastCommError = WSAGetLastError();
+ WSASetLastError(0);
err = TCAPI_ERR_COMM_ERROR;
}
}
@@ -392,6 +417,7 @@
if (res == SOCKET_ERROR)
{
long commErr = WSAGetLastError();
+ WSASetLastError(0);
if ((DWORD)commErr != m_lastCommError)
{
m_lastCommError = commErr;
@@ -414,6 +440,7 @@
{
// SOCKET_ERROR on ioctlsocket
m_lastCommError = WSAGetLastError();
+ WSASetLastError(0);
err = TCAPI_ERR_COMM_ERROR;
}
return err;
@@ -552,6 +579,7 @@
{
err = TCAPI_ERR_COMM_ERROR;
m_lastCommError = sockErr;
+ COMMLOGA1("CTcpComm::SendDataToPort getsockopt=%d\n", sockErr);
COMMLOGCLOSE();
return err;
}
@@ -580,11 +608,15 @@
else if (selErr == SOCKET_ERROR)
{
m_lastCommError = WSAGetLastError();
+ WSASetLastError(0);
+ COMMLOGA1("CTcpComm::SendDataToPort select(SOCKET_ERROR)=%d\n", m_lastCommError);
err = TCAPI_ERR_COMM_ERROR;
}
else if (selErr == 0) // timeout
{
m_lastCommError = WSAGetLastError();
+ WSASetLastError(0);
+ COMMLOGA1("CTcpComm::SendDataToPort select(timeout)=%d\n", m_lastCommError);
err = TCAPI_ERR_COMM_ERROR;
}
}
@@ -602,10 +634,12 @@
if (nSent == SOCKET_ERROR)
{
int wsaErr = WSAGetLastError();
+ WSASetLastError(0);
// ignore "would block" errors
if (wsaErr != WSAEWOULDBLOCK)
{
// TODO: error handling
+ COMMLOGA1("CTcpComm::SendDataToPort send(SOCKET_ERROR)=%d\n", wsaErr);
m_lastCommError = wsaErr;
err = TCAPI_ERR_COMM_ERROR;
break;
@@ -653,14 +687,47 @@
}
bool CTcpComm::IsConnectionEqual(ConnectData* pConn)
{
- if ((strcmp(pConn->tcpSettings.ipAddress, m_ConnectSettings->tcpSettings.ipAddress) == 0) &&
- (strcmp(pConn->tcpSettings.ipPort, m_ConnectSettings->tcpSettings.ipPort) == 0))
+ if ((strcmp(pConn->tcpSettings.ipAddress, m_ConnectSettings->tcpSettings.ipAddress) == 0))
{
- return true;
+ if ((strcmp(pConn->tcpSettings.ipPort, m_ConnectSettings->tcpSettings.ipPort) == 0))
+ {
+ // same port and same IP
+ return true;
+ }
+ else
+ {
+ // different port but same IP
+ return false;
+ }
}
else
{
+ // different IP
return false;
}
}
+int CTcpComm::WSAInit()
+{
+ int wsaErr = 0;
+
+ COMMLOGOPEN();
+ COMMLOGS("CTcpComm::WSAInit\n");
+
+ WSADATA wsaData;
+ wsaErr = WSAStartup(MAKEWORD(2,2), &wsaData);
+
+ COMMLOGCLOSE();
+ return wsaErr;
+}
+
+void CTcpComm::WSAClose()
+{
+ COMMLOGOPEN();
+ COMMLOGS("CTcpComm::WSAClose\n");
+
+ WSACleanup();
+
+ COMMLOGCLOSE();
+}
+