Changes due to continue development of the IpcLibs. Not done yet.
This commit is contained in:
@@ -394,7 +394,7 @@ CChannel::connectionThread(
|
||||
uint32_t reqId;
|
||||
int payloadLength;
|
||||
unsigned long totalPayloadBytesReceived = 0;
|
||||
char reqDataPktHdr[sizeof(ReqDataPktHdrTemplate) - 1];
|
||||
char reqDataPktHdr[ReqDataPktHdrTemplate.length()];
|
||||
char *pRecvBuff;
|
||||
RCMapIter iter;
|
||||
ClientReq *pClientReq;
|
||||
@@ -420,7 +420,7 @@ CChannel::connectionThread(
|
||||
{
|
||||
bytesReceived = recv(pCChannel->m_socket,
|
||||
reqDataPktHdr,
|
||||
sizeof(ReqDataPktHdrTemplate) - 1,
|
||||
sizeof(reqDataPktHdr),
|
||||
MSG_WAITALL);
|
||||
if (bytesReceived == SOCKET_ERROR
|
||||
&& errno == EINTR)
|
||||
@@ -432,7 +432,7 @@ CChannel::connectionThread(
|
||||
if (bytesReceived != SOCKET_ERROR)
|
||||
{
|
||||
// Check if the connection was terminated
|
||||
if (bytesReceived == (sizeof(ReqDataPktHdrTemplate) - 1))
|
||||
if (bytesReceived == sizeof(reqDataPktHdr))
|
||||
{
|
||||
// Get the payload length
|
||||
if (ChannelProto::getReqIdAndPayloadLength(reqDataPktHdr,
|
||||
@@ -759,7 +759,7 @@ CChannel::submitReq(
|
||||
//=======================================================================--
|
||||
{
|
||||
int retStatus = -1;
|
||||
char reqDataPktHdr[sizeof(ReqDataPktHdrTemplate) - 1];
|
||||
char reqDataPktHdr[ReqDataPktHdrTemplate.length()];
|
||||
struct msghdr sendmsgHdr = {0};
|
||||
struct iovec ioVectors[2];
|
||||
unsigned long bytesSent;
|
||||
@@ -941,140 +941,6 @@ CChannel::removeReq(
|
||||
} /*-- CChannel::removeReq() --*/
|
||||
|
||||
|
||||
//++=======================================================================
|
||||
int
|
||||
CChannel::sendData(
|
||||
uint32_t reqId,
|
||||
char *pClientData,
|
||||
int clientDataLen)
|
||||
//
|
||||
// Arguments:
|
||||
//
|
||||
// Returns:
|
||||
//
|
||||
// Abstract:
|
||||
//
|
||||
// Notes:
|
||||
//
|
||||
// L2
|
||||
//=======================================================================--
|
||||
{
|
||||
int retStatus = -1;
|
||||
char reqDataPktHdr[sizeof(ReqDataPktHdrTemplate) - 1];
|
||||
struct msghdr sendmsgHdr = {0};
|
||||
struct iovec ioVectors[2];
|
||||
unsigned long bytesSent;
|
||||
unsigned long totalBytesSent = 0;
|
||||
unsigned long bytesToSend = sizeof(reqDataPktHdr) + clientDataLen;
|
||||
|
||||
DbgTrace(1, "CChannel::sendData- Start, Obj = %08X\n", this);
|
||||
|
||||
// Acquire exclusive access to the channel object
|
||||
pthread_mutex_lock(&m_mutex);
|
||||
|
||||
// Verify that the channel is connected
|
||||
if (m_state == State_Connected)
|
||||
{
|
||||
// Build ReqDataHeader
|
||||
if (ChannelProto::buildReqDataPktHdr(reqId,
|
||||
clientDataLen,
|
||||
reqDataPktHdr) == 0)
|
||||
{
|
||||
// Packet header was built, now sent it along with the client data to
|
||||
// the server.
|
||||
ioVectors[0].iov_base = reqDataPktHdr;
|
||||
ioVectors[0].iov_len = sizeof(reqDataPktHdr);
|
||||
ioVectors[1].iov_base = (char*) pClientData;
|
||||
ioVectors[1].iov_len = clientDataLen;
|
||||
sendmsgHdr.msg_iov = ioVectors;
|
||||
sendmsgHdr.msg_iovlen = 2;
|
||||
while (1)
|
||||
{
|
||||
bytesSent = sendmsg(m_socket,
|
||||
&sendmsgHdr,
|
||||
MSG_NOSIGNAL);
|
||||
if (bytesSent == SOCKET_ERROR)
|
||||
{
|
||||
// Check if we were interrupted during the transfer
|
||||
if (errno == EINTR)
|
||||
{
|
||||
// Just try again
|
||||
continue;
|
||||
}
|
||||
|
||||
// An unrecoverable error was encountered during the send operation,
|
||||
// assume there was a communication failure. Close the socket to make
|
||||
// sure that the connectionThread cleans up.
|
||||
DbgTrace(0, "CChannel::sendData- sendmsg error, errno = %d\n", errno);
|
||||
m_state = State_Disconnected;
|
||||
shutdown(m_socket, SHUT_RDWR);
|
||||
struct linger linger_opt = {1, 15};
|
||||
setsockopt(m_socket, SOL_SOCKET, SO_LINGER, &linger_opt, sizeof(linger_opt));
|
||||
closesocket(m_socket);
|
||||
m_socket = INVALID_SOCKET;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Account for the bytes sent
|
||||
totalBytesSent += bytesSent;
|
||||
|
||||
// Check if we are done sending all of the data
|
||||
if (totalBytesSent >= bytesToSend)
|
||||
{
|
||||
// We are done
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Adjust the ioVector structure to send data not yet sent
|
||||
if (totalBytesSent >= sizeof(reqDataPktHdr))
|
||||
{
|
||||
// The packet header was sent, use only one ioVector.
|
||||
int clientDataAlreadySent = totalBytesSent - sizeof(reqDataPktHdr);
|
||||
ioVectors[0].iov_base = (char*) pClientData + clientDataAlreadySent;
|
||||
ioVectors[0].iov_len = clientDataLen - clientDataAlreadySent;
|
||||
sendmsgHdr.msg_iov = ioVectors;
|
||||
sendmsgHdr.msg_iovlen = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Not all of the packet header was sent, use two ioVectors.
|
||||
ioVectors[0].iov_base = (char*) reqDataPktHdr + totalBytesSent;
|
||||
ioVectors[0].iov_len = sizeof(reqDataPktHdr) - totalBytesSent;
|
||||
ioVectors[1].iov_base = (char*) pClientData;
|
||||
ioVectors[1].iov_len = clientDataLen;
|
||||
sendmsgHdr.msg_iov = ioVectors;
|
||||
sendmsgHdr.msg_iovlen = 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Return success even if the send failed to allow things to be cleaned up
|
||||
// by the connectionThread routine.
|
||||
retStatus = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
DbgTrace(0, "CChannel::sendData- Error building Req Data Pkt Header, Obj = %08X\n", this);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DbgTrace(1, "CChannel::sendData- Channel not connected, state = %08X\n", m_state);
|
||||
}
|
||||
|
||||
// Release exclusive access to the channel object
|
||||
pthread_mutex_unlock(&m_mutex);
|
||||
|
||||
DbgTrace(1, "CChannel::sendData- End, retStatus = %08X\n", retStatus);
|
||||
|
||||
return retStatus;
|
||||
|
||||
} /*-- CChannel::sendData() --*/
|
||||
|
||||
|
||||
//=========================================================================
|
||||
//=========================================================================
|
||||
|
||||
|
||||
Reference in New Issue
Block a user