?? 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 ,也應(yīng)該
/// 進(jìn)一步檢查網(wǎng)絡(luò)是否發(fā)生錯誤
///////////////////////////////////////////////////////////////
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 ) // 發(fā)生錯誤
{
// 注銷事件
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函數(shù)
//
////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//
// 功能: 綁定套接字
// 參數(shù):
// hSocket -- SOCKET(待綁定套接字)
// iBufferSize -- 緩沖區(qū)長度(缺省為TE_SOCKET_BUFFER_SIZE)
// 返回:
// 結(jié)構(gòu)指針(失敗時為NULL)
//
////////////////////////////////////////////////////////////////////////////////
PBSD TE_BSocketAttach(SOCKET hSocket, int iBufferSize /* = TE_SOCKET_BUFFER_SIZE */ )
{
if( hSocket == INVALID_SOCKET)
return NULL;
// 分配內(nèi)存
PBSD pBSD = (PBSD) malloc(sizeof(BSD));
if (pBSD == NULL)
return NULL;
char *pszBuffer = (char *) malloc(iBufferSize);
if (pszBuffer == NULL)
{
free(pBSD);
return NULL;
}
// 設(shè)置結(jié)構(gòu)成員
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;
}
////////////////////////////////////////////////////////////////////////////
//
// 功能: 解開套接字
// 參數(shù):
// pBSD -- BufSocketData結(jié)構(gòu)指針
// bCloseSocket -- 是否在解開套接字同時關(guān)閉套接字(缺省為FALSE)
// 返回:
// 若bCloseSocket為FALSE,返回解開的套接字
// 若bCloseSocket為TRUE ,返回INVALID_SOCKET
//
///////////////////////////////////////////////////////////////////////////
SOCKET TE_BSocketDetach(PBSD pBSD, BOOL bCloseSocket /* = FALSE */ )
{
SOCKET hSocket = pBSD->hSocket;
// 釋放內(nèi)存
free(pBSD->pszBuffer);
free(pBSD);
// 是否關(guān)閉套接字
if (bCloseSocket)
{
TE_CloseSocket(hSocket);
return (INVALID_SOCKET);
}
return (hSocket);
}
////////////////////////////////////////////////////////////////////
//
// 功能: 從緩沖區(qū)讀取數(shù)據(jù)
// 參數(shù):
// pBSD -- BufSocketData結(jié)構(gòu)指針
// dwTimeOut -- 接收超時(缺省為TE_RECV_TIMEOUT)
// 返回:
// 0 --- 成功 (SOCKET_SUCCESS)
// -1 --- 失敗 (SOCKET_ERROR)
//
////////////////////////////////////////////////////////////////////
int TE_BSocketReadData(PBSD pBSD, DWORD dwTimeout /* = TE_RECV_TIMEOUT */ )
{
// 計算緩沖區(qū)空閑區(qū)域
int iMaxRead = pBSD->iBufferSize - pBSD->iBytesInBuffer;
char *pszBuffer = (char *) malloc(iMaxRead + 1);
if (pszBuffer == NULL)
return (SOCKET_ERROR);
// 清空
ZeroMemory(pszBuffer,iMaxRead+1);
// 接收數(shù)據(jù)
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);
}
////////////////////////////////////////////////////////////////////
//
// 功能: 從緩沖區(qū)讀取一個字符
// 參數(shù):
// pBSD -- BufSocketData結(jié)構(gòu)指針
// 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);
}
////////////////////////////////////////////////////////////////////////////
//
// 功能: 從緩沖區(qū)讀取一行(注意,結(jié)尾的回車換行0x0D,0x0A并不包括在其中)
// 參數(shù):
// pBSD -- BufSocketData結(jié)構(gòu)指針
// pszBuffer -- 接收緩沖區(qū)
// iBufferSize -- 緩沖大小
// iStatus -- 狀態(tài) (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);
}
/////////////////////////////////////////////////////////////////////////////////////////
//
// 功能: 從緩沖區(qū)讀取一行(包括單換行0x0A)(注意,結(jié)尾的回車換行不包括在其中)
// 參數(shù):
// pBSD -- BufSocketData結(jié)構(gòu)指針
// pszBuffer -- 接收緩沖區(qū)
// iBufferSize -- 緩沖大小
// iStatus -- 狀態(tài) (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);
}
////////////////////////////////////////////////////////////////////
//
// 功能: 發(fā)送一行 : 自動在最后加上“回車換行符(0x0D,0x0A)”
// 參數(shù):
// pBSD -- BufSocketData結(jié)構(gòu)指針
// pszBuffer -- 待發(fā)送字符串
// dwTimeOut -- 發(fā)送超時(缺省為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);
}
////////////////////////////////////////////////////////////////////
//
// 功能: 獲取套接字
// 參數(shù):
// pBSD -- BufSocketData結(jié)構(gòu)指針
// 返回:
// 與此結(jié)構(gòu)綁定在一起的SOCKET
//
////////////////////////////////////////////////////////////////////
SOCKET TE_BSocketGetAttachedSocket(PBSD pBSD)
{
return (pBSD->hSocket);
}
////////////////////////////////////////////////////////////////////
//
// 功能: 從緩沖區(qū)讀取一定數(shù)量的數(shù)據(jù)
// 參數(shù):
// pBSD -- BufSocketData結(jié)構(gòu)指針
// pszBuffer -- 接收緩沖區(qū)
// iBufferSize -- 緩沖大小
// dwTimeOut -- 接收超時(缺省為TE_RECV_TIMEOUT)
// 返回:
// 讀的數(shù)據(jù)的字節(jié)數(shù)
////////////////////////////////////////////////////////////////////
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 ) // 數(shù)據(jù)不夠多
{
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; // 數(shù)據(jù)全部讀完
}
else // 這次的數(shù)據(jù)足夠多了
{
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;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -