📄 te_socket.cpp
字号:
//////////////////////////////////////////////////////////////////////////
// 睡眠一段时间
/////////////////////////////////////////////////////////////////////////
Sleep(TE_BLOCKED_SNDRCV_SLEEP);
// 注册FD_WRITE事件
if( WSAEventSelect(hSocket, (WSAEVENT) hWriteEvent, FD_WRITE) == SOCKET_ERROR)
{
CloseHandle(hWriteEvent);
TE_SetLastError( WSAGetLastError() );
return (SOCKET_ERROR);
}
DWORD dwWaitResult = WSAWaitForMultipleEvents(1, &hWriteEvent, TRUE,dwTimeout, TRUE);
if( dwWaitResult != WSA_WAIT_EVENT_0 )
{
// 注销事件
WSAEventSelect(hSocket, (WSAEVENT) hWriteEvent, 0);
CloseHandle(hWriteEvent);
TE_SetLastError( WSAGetLastError() );
return (SOCKET_ERROR);
}
//////////////////////////////////////////////////////////////
/// 注意:即使 dwWaitResult == WSA_WAIT_EVENT0 ,也应该
/// 进一步检查网络是否发生错误
///////////////////////////////////////////////////////////////
WSANETWORKEVENTS NetEvent;
if(WSAEnumNetworkEvents(hSocket,(WSAEVENT)hWriteEvent,&NetEvent) == SOCKET_ERROR)
{
// 注销事件
WSAEventSelect(hSocket, (WSAEVENT) hWriteEvent, 0);
CloseHandle(hWriteEvent);
TE_SetLastError( WSAGetLastError() );
return (SOCKET_ERROR);
}
if(NetEvent.iErrorCode[FD_WRITE_BIT] !=0 ) // 发生错误
{
// 注销事件
WSAEventSelect(hSocket, (WSAEVENT) hWriteEvent, 0);
CloseHandle(hWriteEvent);
TE_SetLastError(NetEvent.iErrorCode[FD_WRITE_BIT]);
return (SOCKET_ERROR);
}
////////////////////////////////////////////////////////////////
// 注销事件
WSAEventSelect(hSocket, (WSAEVENT) hWriteEvent, 0);
}
CloseHandle(hWriteEvent);
return ((int) dwRtxBytes);
}
////////////////////////////////////////////////////////////////////////////////
//
// BSocket函数
//
////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//
// 功能: 绑定套接字
// 参数:
// hSocket -- SOCKET(待绑定套接字)
// iBufferSize -- 缓冲区长度(缺省为TE_SOCKET_BUFFER_SIZE)
// 返回:
// 结构指针(失败时为NULL)
//
////////////////////////////////////////////////////////////////////////////////
PBSD TE_BSocketAttach(SOCKET hSocket, int iBufferSize /* = TE_SOCKET_BUFFER_SIZE */ )
{
if( hSocket == INVALID_SOCKET)
return NULL;
// 分配内存
PBSD pBSD = (PBSD) malloc(sizeof(BSD));
if (pBSD == NULL)
return NULL;
char *pszBuffer = (char *) malloc(iBufferSize);
if (pszBuffer == NULL)
{
free(pBSD);
return NULL;
}
// 设置结构成员
ZeroMemory(pBSD,sizeof(BSD));
ZeroMemory(pszBuffer,iBufferSize);
pBSD->hSocket = hSocket;
pBSD->iBufferSize = iBufferSize;
pBSD->pszBuffer = pszBuffer;
pBSD->iBytesInBuffer = 0;
pBSD->iReadIndex = 0;
pBSD->iBufferIndex = 0;
return pBSD;
}
////////////////////////////////////////////////////////////////////////////
//
// 功能: 解开套接字
// 参数:
// pBSD -- BufSocketData结构指针
// bCloseSocket -- 是否在解开套接字同时关闭套接字(缺省为FALSE)
// 返回:
// 若bCloseSocket为FALSE,返回解开的套接字
// 若bCloseSocket为TRUE ,返回INVALID_SOCKET
//
///////////////////////////////////////////////////////////////////////////
SOCKET TE_BSocketDetach(PBSD pBSD, BOOL bCloseSocket /* = FALSE */ )
{
SOCKET hSocket = pBSD->hSocket;
// 释放内存
free(pBSD->pszBuffer);
free(pBSD);
// 是否关闭套接字
if (bCloseSocket)
{
TE_CloseSocket(hSocket);
return (INVALID_SOCKET);
}
return (hSocket);
}
////////////////////////////////////////////////////////////////////
//
// 功能: 从缓冲区读取数据
// 参数:
// pBSD -- BufSocketData结构指针
// dwTimeOut -- 接收超时(缺省为TE_RECV_TIMEOUT)
// 返回:
// 0 --- 成功 (SOCKET_SUCCESS)
// -1 --- 失败 (SOCKET_ERROR)
//
////////////////////////////////////////////////////////////////////
int TE_BSocketReadData(PBSD pBSD, DWORD dwTimeout /* = TE_RECV_TIMEOUT */ )
{
// 计算缓冲区空闲区域
int iMaxRead = pBSD->iBufferSize - pBSD->iBytesInBuffer;
char *pszBuffer = (char *) malloc(iMaxRead + 1);
if (pszBuffer == NULL)
return (SOCKET_ERROR);
// 清空
ZeroMemory(pszBuffer,iMaxRead+1);
// 接收数据
int iReadedBytes = TE_RecvData(pBSD->hSocket, pszBuffer, iMaxRead, dwTimeout);
if (iReadedBytes > 0)
{
int iHeadSize = Min(pBSD->iBufferSize - pBSD->iBufferIndex, iReadedBytes);
if (iHeadSize > 0)
memcpy(pBSD->pszBuffer + pBSD->iBufferIndex, pszBuffer, iHeadSize);
pBSD->iBufferIndex += iHeadSize;
if (pBSD->iBufferIndex == pBSD->iBufferSize)
pBSD->iBufferIndex = 0;
int iBackSize = iReadedBytes - iHeadSize;
if (iBackSize > 0)
memcpy(pBSD->pszBuffer + pBSD->iBufferIndex, pszBuffer + iHeadSize, iBackSize);
pBSD->iBufferIndex += iBackSize;
pBSD->iBytesInBuffer += iReadedBytes;
}
free(pszBuffer);
return (iReadedBytes);
}
////////////////////////////////////////////////////////////////////
//
// 功能: 从缓冲区读取一个字符
// 参数:
// pBSD -- BufSocketData结构指针
// dwTimeOut -- 接收超时(缺省为TE_RECV_TIMEOUT)
// 返回:
// 一个字符(错误时返回TE_EOF)
//
////////////////////////////////////////////////////////////////////
int TE_BSocketGetChar(PBSD pBSD, DWORD dwTimeout /* = TE_RECV_TIMEOUT */ )
{
if ((pBSD->iBytesInBuffer == 0) && (TE_BSocketReadData(pBSD, dwTimeout) <= 0))
return (TE_EOF);
int iChar =( (int) pBSD->pszBuffer[pBSD->iReadIndex]) & 0x000000ff;
pBSD->iReadIndex = INext(pBSD->iReadIndex, pBSD->iBufferSize);
--pBSD->iBytesInBuffer;
return (iChar);
}
////////////////////////////////////////////////////////////////////////////
//
// 功能: 从缓冲区读取一行(注意,结尾的回车换行0x0D,0x0A并不包括在其中)
// 参数:
// pBSD -- BufSocketData结构指针
// pszBuffer -- 接收缓冲区
// iBufferSize -- 缓冲大小
// iStatus -- 状态 (0:正常,1:缓冲不够,-1:错误)
// dwTimeOut -- 接收超时(缺省为TE_RECV_TIMEOUT)
// 返回:
// 0 --- 成功 (SOCKET_SUCCESS)
// -1 --- 失败 (SOCKET_ERROR)
//
////////////////////////////////////////////////////////////////////////////
int TE_BSocketGetString(PBSD pBSD, char *pszBuffer, int iBufferSize, int* iStatus, DWORD dwTimeout /* = TE_RECV_TIMEOUT */ )
{
*iStatus = 1; //缓冲长度不足
int ii,iChar;
for (ii = 0; ii < (iBufferSize - 1);)
{
iChar = TE_BSocketGetChar(pBSD, dwTimeout);
if (iChar == TE_EOF)
{
*iStatus = (-1) ;
return SOCKET_ERROR;
}
if (iChar == 0x0D) // 回车符号
{
iChar = TE_BSocketGetChar(pBSD, dwTimeout);
if (iChar == TE_EOF)
{
*iStatus = (-1);
return (SOCKET_ERROR);
}
if (iChar == 0x0A) // 换行
{
*iStatus = 0; //正常情况
break;
}
else
pszBuffer[ii++] = 0x0D;
}
else
pszBuffer[ii++] = (char) iChar;
}
pszBuffer[ii] = '\0';
return (SOCKET_SUCCESS);
}
/////////////////////////////////////////////////////////////////////////////////////////
//
// 功能: 从缓冲区读取一行(包括单换行0x0A)(注意,结尾的回车换行不包括在其中)
// 参数:
// pBSD -- BufSocketData结构指针
// pszBuffer -- 接收缓冲区
// iBufferSize -- 缓冲大小
// iStatus -- 状态 (0:正常,1:缓冲不够,-1:错误)
// dwTimeOut -- 接收超时(缺省为TE_RECV_TIMEOUT)
// 返回:
// 0 --- 成功 (SOCKET_SUCCESS)
// -1 --- 失败 (SOCKET_ERROR)
//
//////////////////////////////////////////////////////////////////////////////////////////
int TE_BSocketGetStringEx(PBSD pBSD, char *pszBuffer, int iBufferSize, int* iStatus, DWORD dwTimeout /* = TE_RECV_TIMEOUT */ )
{
*iStatus = 1; //缓冲长度不足
int ii,iChar;
int LastChar = TE_EOF;
for (ii = 0; ii < (iBufferSize - 1);)
{
iChar = TE_BSocketGetChar(pBSD, dwTimeout);
if (iChar == TE_EOF)
{
*iStatus = (-1) ;
return SOCKET_ERROR;
}
if (iChar == 0x0A) // 换行符号
{
*iStatus = 0; //正常情况
if (LastChar == 0x0D)
ii-- ;
break;
}
else
pszBuffer[ii++] = (char) iChar;
LastChar = iChar;
}
pszBuffer[ii] = '\0';
return (SOCKET_SUCCESS);
}
////////////////////////////////////////////////////////////////////
//
// 功能: 发送一行 : 自动在最后加上“回车换行符(0x0D,0x0A)”
// 参数:
// pBSD -- BufSocketData结构指针
// pszBuffer -- 待发送字符串
// dwTimeOut -- 发送超时(缺省为TE_SEND_TIMEOUT)
// 返回:
// 0 --- 成功 (SOCKET_SUCCESS)
// -1 --- 失败 (SOCKET_ERROR)
//
////////////////////////////////////////////////////////////////////
int TE_BSocketSendString(PBSD pBSD, const char *pszBuffer, DWORD dwTimeout /* = TE_SEND_TIMEOUT */ )
{
char *pszSendBuffer = (char *) malloc(strlen(pszBuffer) + 3);
if (pszSendBuffer == NULL)
return (SOCKET_ERROR);
ZeroMemory( pszSendBuffer,strlen(pszBuffer) + 3);
sprintf(pszSendBuffer, "%s\r\n", pszBuffer);
int iSendLength = strlen(pszSendBuffer);
if (TE_Send(pBSD->hSocket, pszSendBuffer, iSendLength, dwTimeout) != iSendLength)
{
free(pszSendBuffer);
return (SOCKET_ERROR);
}
free(pszSendBuffer);
return (iSendLength);
}
////////////////////////////////////////////////////////////////////
//
// 功能: 获取套接字
// 参数:
// pBSD -- BufSocketData结构指针
// 返回:
// 与此结构绑定在一起的SOCKET
//
////////////////////////////////////////////////////////////////////
SOCKET TE_BSocketGetAttachedSocket(PBSD pBSD)
{
return (pBSD->hSocket);
}
////////////////////////////////////////////////////////////////////
//
// 功能: 从缓冲区读取一定数量的数据
// 参数:
// pBSD -- BufSocketData结构指针
// pszBuffer -- 接收缓冲区
// iBufferSize -- 缓冲大小
// dwTimeOut -- 接收超时(缺省为TE_RECV_TIMEOUT)
// 返回:
// 读的数据的字节数
////////////////////////////////////////////////////////////////////
int TE_BSocketGetData(PBSD pBSD, char *pszBuffer, int iBufferSize,DWORD dwTimeout /*= TE_RECV_TIMEOUT*/)
{
int iReadBytes = 0;
int iHeadSize,iBackSize;
if ((pBSD->iBytesInBuffer == 0) && (TE_BSocketReadData(pBSD, dwTimeout) <= 0))
return 0;
if( pBSD->iBytesInBuffer < iBufferSize ) // 数据不够多
{
iHeadSize = Min( pBSD->iBufferSize - pBSD->iReadIndex ,pBSD->iBytesInBuffer );
memcpy(pszBuffer+iReadBytes,pBSD->pszBuffer+pBSD->iReadIndex,iHeadSize);
pBSD->iReadIndex += iHeadSize;
if( pBSD->iReadIndex == pBSD->iBufferSize )
pBSD->iReadIndex = 0;
iReadBytes += iHeadSize;
iBackSize = pBSD->iBytesInBuffer - iHeadSize;
if( iBackSize > 0)
memcpy(pszBuffer+iReadBytes,pBSD->pszBuffer+pBSD->iReadIndex,iBackSize);
iReadBytes += iBackSize;
pBSD->iReadIndex += iBackSize;
pBSD->iBytesInBuffer = 0; // 数据全部读完
}
else // 这次的数据足够多了
{
iHeadSize = Min( pBSD->iBufferSize - pBSD->iReadIndex,iBufferSize - iReadBytes );
memcpy(pszBuffer+iReadBytes,pBSD->pszBuffer+pBSD->iReadIndex,iHeadSize);
pBSD->iReadIndex += iHeadSize;
if( pBSD->iReadIndex == pBSD->iBufferSize )
pBSD->iReadIndex = 0;
iReadBytes += iHeadSize;
iBackSize = iBufferSize - iReadBytes;
if( iBackSize > 0)
memcpy(pszBuffer+iReadBytes,pBSD->pszBuffer+pBSD->iReadIndex,iBackSize);
iReadBytes += iBackSize;
pBSD->iReadIndex += iBackSize;
pBSD->iBytesInBuffer -= (iHeadSize+iBackSize);
}
return iReadBytes;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -