📄 censocket.cpp
字号:
#include "CenSocket.h"
#include "FCDReceive.h"
CCenSocket::CCenSocket(void *pParent, string strIP, unsigned short uPort, int iProtocol)
{
CCenSocket();
SetPara(pParent, strIP, uPort, iProtocol);
//m_bIsReady = false;
}
CCenSocket::CCenSocket()
{
m_sock = INVALID_SOCKET;
#ifdef _WIN32_
WSADATA wsaData;
WSAStartup(MAKEWORD(2,2), &wsaData);
#endif
}
CCenSocket::~CCenSocket(void)
{
}
///////////////////////////////////////////////////////////
//设置SOCKET参数。
void CCenSocket::SetPara(void *pParent, string strIP, unsigned short uProt, int iProtocol)
{
m_strSvrIP = strIP;
m_uSvrPort = uProt;
m_iProtocol = iProtocol;
m_sock = INVALID_SOCKET;
m_pParent = (CFCDReceive *)pParent;
//==================================================
m_sockaddr_in.sin_addr.s_addr = inet_addr(m_strSvrIP.c_str());
m_sockaddr_in.sin_family = AF_INET;
m_sockaddr_in.sin_port = htons(m_uSvrPort);
//如果不是ip的话,进行地址解析
if (m_sockaddr_in.sin_addr.s_addr == INADDR_NONE)
{
struct hostent *host = NULL;
host = gethostbyname(m_strSvrIP.c_str());
if (host == NULL)
{
cerr<<"无法解析主机地址: "<<m_strSvrIP.c_str()<<endl;
return;
}
memcpy(&m_sockaddr_in.sin_addr, host->h_addr_list[0], host->h_length);
}
}
///////////////////////////////////////////////////////////
//对SOCKET初始化
bool CCenSocket::Init()
{
if (m_sock == INVALID_SOCKET)
{
//创建SOCKET
if (!Create())
{
return false;
}
}
//连接服务器,如果为UDP方式,则不用连接
if (m_iProtocol == SOCK_STREAM)
{
if (!Connect(m_strSvrIP, m_uSvrPort))
{
printf("SOCKET不能连接到服务器. \r\n");
return false;
}
}
else//UDP:绑定IP及端口
{
if (SOCKET_ERROR == bind(m_sock, (SOCKADDR *) &m_sockaddr_in, sizeof(m_sockaddr_in)))
{
return false;
}
}
return true;
}
///////////////////////////////////////////////////////////
//创建套接字
bool CCenSocket::Create()
{
if (m_sock == INVALID_SOCKET)
{
if (m_iProtocol == SOCK_DGRAM)
{
m_sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
}
else
{
m_sock = socket(AF_INET, SOCK_STREAM, 0);
}
}
if (m_sock != INVALID_SOCKET)
{
return true;
}
if (m_iProtocol == SOCK_STREAM)
{
int ret;
//设置重用
int nREUSEADDR = 1;
setsockopt(m_sock, SOL_SOCKET, SO_REUSEADDR, (const char*)&nREUSEADDR, sizeof(int));
//设置非阻塞方式连接
unsigned long ul = 1;
ret = ioctlsocket(m_sock, FIONBIO, (unsigned long*)&ul);
if(ret==SOCKET_ERROR)return 0;
}
return false;
}
///////////////////////////////////////////////////////////////
//连接服务器
bool CCenSocket::Connect(string strIP, unsigned short uPort)
{
if (m_iProtocol != SOCK_STREAM && m_sock == INVALID_SOCKET)
{
return false;
}
int icnn = connect(m_sock, (sockaddr*)&m_sockaddr_in, sizeof (m_sockaddr_in));
//错误处理
if (icnn == SOCKET_ERROR)
{
return false;
}
else
{
return true;
}
}
///////////////////////////////////////////////////////////////
bool CCenSocket::BeginRec()
{
assert(m_sock != INVALID_SOCKET);
if (m_iProtocol == SOCK_STREAM )
{
Receive();
}
else if (m_iProtocol == SOCK_DGRAM)
{
ReceiveFrom();
}
//网络中断,返回了
//m_bIsReady = false;
return false;
}
/////////////////////////////////////////////////////////////////
//tcp 方式接收数据
void CCenSocket::Receive()
{
assert(m_iProtocol == SOCK_STREAM);
int iRec = 0;
char buff[524288] = {0};
while(1)
{
int iRec;
iRec = recv(m_sock, buff, 524287, 0);
if ( iRec <= 0)
{
closesocket(m_sock);
m_sock = INVALID_SOCKET;
return;
}
m_pParent->OnReceiveData(buff, iRec);
}
return;
}
///////////////////////////////////////////////////////////////
//udp 方式接收数据
void CCenSocket::ReceiveFrom()
{
assert(m_iProtocol == SOCK_DGRAM);
int iRec = 0;
char buff[1000000]={0};
sockaddr_in SenderAddr;
int iPort = sizeof(SenderAddr);
int iCnt = 0;
//m_bIsReady = true;
while(1)
{
//得到数据
iRec = recvfrom(m_sock, buff, 1000000, 0, (SOCKADDR*)&SenderAddr, &iPort);
if (iRec < 0)
{
continue;
}
buff[iRec] = NULL;
m_pParent->OnReceiveData(buff, iRec);
}
}
///////////////////////////////////////////////////////////////
//数据发送
int CCenSocket::Send(char *pString, int iLength)
{
int iSnd = 0;
if (m_iProtocol == SOCK_STREAM && m_sock != INVALID_SOCKET)
{
iSnd = send(m_sock, pString, iLength, 0);
}
return iSnd;
}
///////////////////////////////////////////////////////////////
//关闭SOCKET链接
int CCenSocket::Close()
{
shutdown(m_sock, 0x02);
return closesocket(m_sock);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -