// WinSocket.cpp: implementation of the CWinSocket class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "WinSocket.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
#pragma comment(lib, "ws2_32.lib")
//
BOOL InitSocket(WSADATA* lpwsaData /* = NULL */ )
{
// initialize Winsock library
WSADATA wsaData;
if (lpwsaData == NULL)
lpwsaData = &wsaData;
WORD wVersionRequested = MAKEWORD(1, 1);
int nResult = WSAStartup(wVersionRequested, lpwsaData);
if (nResult != 0)
return FALSE;
if (LOBYTE(lpwsaData->wVersion) != 1 || HIBYTE(lpwsaData->wVersion) != 1)
{
WSACleanup();
return FALSE;
}
return TRUE ;
}
void UnInitSocket()
{
// 清除事件侦听池。
CASYNCSocket::s_SockEventListenerPool.CleanPool() ;
// 反初始化。
WSACleanup() ;
}
BOOL GetSOCKADDR(SOCKADDR_IN & addr, int port, const char * pHostAddr/* = NULL */ )
{
memset(&addr,0,sizeof(SOCKADDR_IN));
addr.sin_family = AF_INET;
addr.sin_port = htons((unsigned short)port);
// 转换IP地址, 如果addr指向主机名,则进而得到其IP 。
if (pHostAddr == NULL){
addr.sin_addr.s_addr = htonl(INADDR_ANY);
}
else{
DWORD lResult = inet_addr(pHostAddr);
if (lResult == INADDR_NONE){
LPHOSTENT lphost;
lphost = gethostbyname(pHostAddr);
if (lphost != NULL){
lResult = ((LPIN_ADDR)lphost->h_addr)->s_addr;
}
else{
WSASetLastError(WSAEINVAL);
return FALSE;
}
}
addr.sin_addr.s_addr = lResult;
}
//
return TRUE ;
}
BOOL GetIPFromAddr(const char * pHostAddr, char * pHostIP)
{
if (pHostAddr == NULL || *pHostAddr == '\0' || inet_addr(pHostAddr) == INADDR_NONE){
struct hostent * pHost;
pHost = gethostbyname(pHostAddr);
if(pHost!= NULL && pHost->h_addr_list[0]!= NULL){
::memcpy(pHostIP, inet_ntoa (*(struct in_addr *)pHost->h_addr_list[0]), 16) ;
return TRUE ;
}
else{
return FALSE ;
}
}
else{
::strcpy(pHostIP, pHostAddr) ;
return TRUE ;
}
}
//
CWinSocket::CWinSocket()
{
m_hSocket = INVALID_SOCKET ;
}
CWinSocket::CWinSocket(SOCKET hSock)
{
Attach(hSock) ;
}
CWinSocket::~CWinSocket()
{
Close() ;
}
BOOL CWinSocket::Attach(SOCKET hSocket)
{
// 如果已连接了SOCKET,则关闭。
if(IS_SOCKET(m_hSocket))
Close() ;
// 设置新的SOCKET。
m_hSocket = hSocket ;
return TRUE ;
}
SOCKET CWinSocket::Detach()
{
SOCKET s = m_hSocket ;
m_hSocket = INVALID_SOCKET ;
return s ;
}
BOOL CWinSocket::Create(int nSocketType , int port/* = 0 */ , const char * ip/* = NULL */)
{
Close() ;
m_hSocket = socket(AF_INET,nSocketType,0);
if (m_hSocket != INVALID_SOCKET)
{
if (Bind(port, ip))
return TRUE;
int nResult = GetLastError();
Close();
WSASetLastError(nResult);
}
return FALSE;
}
BOOL CWinSocket::GetRemoteAddr(char * ip , int * port )
{
SOCKADDR_IN sockAddr;
memset(&sockAddr, 0, sizeof(sockAddr));
//
int nSockAddrLen = sizeof(sockAddr);
int iRet = getpeername(m_hSocket, (SOCKADDR*)&sockAddr, &nSockAddrLen);
if (SOCKET_ERROR != iRet)
{
*port = ntohs(sockAddr.sin_port) ;
::strcpy(ip,inet_ntoa(sockAddr.sin_addr)) ;
}
return iRet != SOCKET_ERROR;
}
BOOL CWinSocket::GetLocalAddr (char * ip , int * port )
{
SOCKADDR_IN sockAddr;
memset(&sockAddr, 0, sizeof(sockAddr));
//
int nSockAddrLen = sizeof(sockAddr);
int iRet = getsockname(m_hSocket, (SOCKADDR*)&sockAddr, &nSockAddrLen);
if (SOCKET_ERROR != iRet)
{
*port = ntohs(sockAddr.sin_port) ;
::strcpy(ip,inet_ntoa(sockAddr.sin_addr)) ;
}
return iRet != SOCKET_ERROR ;
}
/***************************************************************************
名称:TestRecv
描述:处理连接请求
输入:dwTimeoutms 超时时间,单位(毫秒)
输出:无
返回:1、当SOCKET还没有创建时,返回SOCKET_ERROR
2、当SOCKET还没有建立连接时,返回SOCKET_TIMEOUT
3、当SOCKET已创建并成功建立了连接时,
如果有数据到达,则返回数据长度(此时不管中途对方是否已断开连接),
否则返回SOCKET_TIMEOUT
4、如果在测试期间SOCKET被关闭,则返回SOCKET_ERROR
5、如果在正常连接的情况下,对方断开了连接,
在SOCKET被关闭之前,如果此时缓冲区中的数据没有被读完,则返回数据长度,否则返回SOCKET_ERROR ;
在SOCKET被关闭之后返回SOCKET_ERROR
***************************************************************************/
int CWinSocket::TestRecv(DWORD dwTimeoutms/* = -1 */ )
{
DWORD s = dwTimeoutms/1000 ;
DWORD ms = dwTimeoutms%1000 ;
struct timeval tvRecv = {s, ms*1000}, tvExp = {0,0};
//
int iRet ;
fd_set fdRecv;
FD_ZERO(&fdRecv);
FD_SET(m_hSocket,&fdRecv);
iRet = select(1,&fdRecv,NULL,NULL,&tvRecv);
switch(iRet)
{
case 0 :
return SOCKET_TIMEOUT ;
break;
case 1:{
int dataLen = GetDataLength() ;
if(dataLen <= 0)
return SOCKET_ERROR ;
else
return dataLen ;
}
break;
}
//
return SOCKET_ERROR ;
}
/***************************************************************************
名称:TestSend
描述:处理连接请求
输入:dwTimeoutms 超时时间,单位(毫秒)
输出:无
返回:1、当SOCKET还没有创建时,返回SOCKET_ERROR
2、当SOCKET还没有建立连接时,返回SOCKET_TIMEOUT
3、当SOCKET已创建并成功建立了连接时,
如果可以发送数据,则返回SOCKET_SUCCESS,否则返回SOCKET_TIMEOUT
4、如果在测试期间SOCKET被关闭,则返回SOCKET_ERROR
5、如果在正常连接的情况下,对方断开了连接,
在SOCKET没有被关闭之前返回SOCKET_SUCCESS(但此时调用Send()函数将返回-1,即发送失败),
在SOCKET被关闭之后返回SOCKET_ERROR
***************************************************************************/
int CWinSocket::TestSend(DWORD dwTimeoutms/* = -1 */ )
{
DWORD s = dwTimeoutms/1000 ;
DWORD ms = dwTimeoutms%1000 ;
struct timeval tvSend = {s,ms*1000}, tvExp = {0,0};
//
int iRet ;
fd_set fdSend;
FD_ZERO(&fdSend);
FD_SET(m_hSocket,&fdSend);
iRet = select(1,NULL,&fdSend,NULL,&tvSend);
switch(iRet)
{
case 0 :
return SOCKET_TIMEOUT ;
break;
case 1:
return SOCKET_SUCCESS ;
break;
}
return SOCKET_ERROR ;
}
int CWinSocket::RecvFrom(char * buf, int len, char * ip/* = NULL */ , int * port/* = NULL */, int flags/* = 0 */ )
{
SOCKADDR_IN sockAddr;
memset(&sockAddr, 0, sizeof(sockAddr));
//
int nSockAddrLen = sizeof(sockAddr);
int nResult = recvfrom(m_hSocket, buf, len, flags ,(SOCKADDR*)&sockAddr, &nSockAddrLen);
if(nResult != SOCKET_ERROR)
{
if(port != NULL)
*port = ntohs(sockAddr.sin_port) ;
if(ip != NULL)
::strcpy(ip,inet_ntoa(sockAddr.sin_addr)) ;
}
return nResult;
}
int CWinSocket::SendTo (const char * buf, int len, const char * ip, int port, int flags/* = 0 */ )
{
SOCKADDR_IN sockAddr;
if(!GetSOCKADDR(sockAddr, port, ip))
return SOCKET_ERROR ;
//
return sendto(m_hSocket, buf, len, flags , (SOCKADDR*)&sockAddr, sizeof(sockAddr));
}
//
int CWinSocket::RecvWantEX(char * buf, int &len, DWORD dwTimeoutms /*= -1*/, int flags /*= 0*/)
{
int curPos = 0 ;
int iRet ;
DWORD dwTime = 0 ;
while(curPos < len){
iRet = TestRecv(10) ;
if(iRet > 0){ // 有数据到达。
int recvLen = Recv(buf+curPos, len-curPos) ;
if(recvLen < 0){
len = curPos ;
return SOCKET_ERROR ;
}
curPos += recvLen ;
}
else if(iRet == SOCKET_TIMEOUT){
dwTime += 10 ;
if(dwTime >= dwTimeoutms){
len = curPos ;
return SOCKET_TIMEOUT ;
}
}
else {
len = curPos ;
return SOCKET_ERROR ;
}
}
len = curPos ;
return SOCKET_SUCCESS ;
}
int CWinSocket::SendWantEX(const char * buf, int &len, DWORD dwTimeoutms /*= -1 */, int flags /*= 0*/)
{
int curPos = 0 ;
int iRet ;
DWORD dwTime = 0 ;
while(curPos < len){
iRet = TestSend(10) ;
if(iRet == SOCKET_SUCCESS){
int sendLen = len-curPos > 1400 ? 1400 :
没有合适的资源?快使用搜索试试~ 我知道了~
EAL.zip_VC扩展库
共64个文件
h:33个
cpp:30个
tmp:1个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 28 浏览量
2022-09-23
18:57:59
上传
评论
收藏 111KB ZIP 举报
温馨提示
一个用于快速开发的常用封装库
资源推荐
资源详情
资源评论
收起资源包目录
EAL.zip (64个子文件)
EAL
DBIdFactory.h 884B
XNetConnection.cpp 16KB
DBSourceEnum.h 744B
XIconTreeCtrl.h 2KB
XImageList.cpp 5KB
ToolbarEx.cpp 4KB
ObjPool.cpp 4KB
StringEx.h 8KB
XIconTreeCtrl.cpp 7KB
Net.cpp 6KB
XMenuBmpsContainer.h 784B
ADODB.h 20KB
Net.h 4KB
Timer.h 1KB
ProFile.h 1KB
Thread.cpp 5KB
MultiLangMgr.h 3KB
PropertyPageTab.h 10KB
XBmpsContainer.cpp 5KB
WinSocket.h 11KB
WinSocket.cpp 24KB
XMLNetConnection.cpp 13KB
XML.h 15KB
DBSourceEnum.cpp 3KB
DBParam.cpp 10KB
ADODB.cpp 6KB
TextLog.h 2KB
AdoConnectionPool.cpp 5KB
XMLNetConnection.h 8KB
CommFunc.h 5KB
MFCWTMsgMap.h 1KB
XMenuBmpsContainer.cpp 2KB
StringEx.cpp 15KB
DBFileStore.h 2KB
XImageList.h 1KB
PropertyPageTab.cpp 4KB
XML.cpp 16KB
CodeStringMap.h 2KB
DBTableOpr.cpp 15KB
MultiLangStringMap.cpp 10KB
TextMsg.h 3KB
Thread.h 10KB
DBFileStore.cpp 10KB
ObjPool.h 4KB
DBTreeOpr.h 3KB
DBTreeOpr.cpp 13KB
Timer.cpp 3KB
XImageListMgr.h 858B
TextMsg.cpp 9KB
MenuEx.cpp 449B
DBTableOpr.h 5KB
DBIdFactory.cpp 2KB
MultiLangMgr.cpp 18KB
TextLog.cpp 4KB
AdoConnectionPool.h 2KB
MVC3A9.tmp 0B
DBParam.h 4KB
MultiLangStringMap.h 2KB
ToolbarEx.h 885B
CommFunc.cpp 13KB
XNetConnection.h 9KB
XBmpsContainer.h 1KB
MenuEx.h 2KB
XImageListMgr.cpp 2KB
共 64 条
- 1
资源评论
寒泊
- 粉丝: 78
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功