📄 network.cpp
字号:
// Network.cpp: implementation of the CNetwork class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Network.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CNetwork::CNetwork()
{
}
CNetwork::~CNetwork()
{
}
bool CNetwork::InitialSocket()
{
//初始化变量
m_hSocket=NULL;
m_iReceived=0; //已接收的字节数
WSADATA wsa;
if(WSAStartup(MAKEWORD(2, 2), &wsa) == SOCKET_ERROR)
return false;
if(LOBYTE(wsa.wVersion) != 2 || HIBYTE(wsa.wVersion) != 2)
{
WSACleanup();
return false;
}
//创建套接字
m_hSocket= socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(m_hSocket == INVALID_SOCKET)
{
m_hSocket = NULL;
TRACE0("创建套节子失败");
return false;
}
//填充地址结构
memset(&m_sockAddr, 0, sizeof(m_sockAddr));
m_sockAddr.sin_family = AF_INET;
m_sockAddr.sin_addr.s_addr = inet_addr(m_cIP);
m_sockAddr.sin_port = htons(m_usPort);
int SendTimeout = 1000*60;//ms
int RecvTimeout = 1000*90;//ms
if(::setsockopt(m_hSocket,SOL_SOCKET,SO_SNDTIMEO,(char*)&SendTimeout, sizeof(int))==SOCKET_ERROR)
{ //设置发送超时
return false;
}
if(::setsockopt(m_hSocket,SOL_SOCKET,SO_RCVTIMEO,(char*)&RecvTimeout, sizeof(int))==SOCKET_ERROR)
{
//设置接收超时
return false;
}
return true;
}
bool CNetwork::ConnectServer()
{
if(connect(m_hSocket,(sockaddr*)&m_sockAddr,sizeof(m_sockAddr))==0)
return true;
else
return false;
}
bool CNetwork::SendString(char *buf, int length)
{
int nLeft,idx,ret,flag=1;
nLeft=length;
idx=0;
while(nLeft>0) //确保完全发送出去
{
ret=send(m_hSocket,&buf[idx],nLeft,0);
if(ret==SOCKET_ERROR)
{
flag=0;
closesocket(m_hSocket); //关闭套接字
break;
}
nLeft-=ret;
idx+=ret;
}
//返回判断
if(flag==0)
return false;
else
{
TRACE1("send %d",ret);
return true;
}
}
bool CNetwork::GetString(char *recBuf,int recBufSize)
{
int ret,nLeft,idx,flag=1,icount=0;
nLeft=recBufSize;
idx=0;
while(nLeft>0)
{
ret=recv(m_hSocket,&recBuf[idx],nLeft,0);
if(ret==SOCKET_ERROR || ret==0 || ret==WSAETIMEDOUT) //套接字出错或者已经关闭或超时
{
flag=0;
closesocket(m_hSocket); //关闭套接字
break;
}
idx+=ret;
nLeft-=ret;
}
//返回判断
if(flag==0)
{
TRACE1("recv errorcode: %d",ret);
TRACE1("WSAGetLastError(): %d",WSAGetLastError());
return false;
}
else
return true;
//if no data arrives within the period specified in SO_RCVTIMEO
//the recv function returns WSAETIMEDOUT,
//and if data is received, recv returns SUCCESS.
}
void CNetwork::CloseSock()
{
if(m_hSocket != NULL)
{
closesocket(m_hSocket);
m_hSocket=NULL;
WSACleanup();
//AfxMessageBox("closesocket ok!");
}
}
bool CNetwork::ReConnectServer() //重新连接应用服务器
{
int i;
if(m_hSocket != NULL)
{
closesocket(m_hSocket);
m_hSocket=NULL;
}
//创建套接字
m_hSocket= socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(m_hSocket == INVALID_SOCKET)
{
m_hSocket = NULL;
TRACE0("重新创建套节子失败");
return false;
}
int SendTimeout = 1000*60;//ms
int RecvTimeout = 1000*90;//ms
if(::setsockopt(m_hSocket,SOL_SOCKET,SO_SNDTIMEO,(char*)&SendTimeout, sizeof(int))==SOCKET_ERROR)
{ //设置发送超时
return false;
}
if(::setsockopt(m_hSocket,SOL_SOCKET,SO_RCVTIMEO,(char*)&RecvTimeout, sizeof(int))==SOCKET_ERROR)
{
//设置接收超时
return false;
}
for(i=0;i<3;i++) //重新连接尝试3次
{
if(connect(m_hSocket,(sockaddr*)&m_sockAddr,sizeof(m_sockAddr))==0)
break;
Sleep(1000);
}
if(i>=3)
{
i=0;
TRACE0("重新连接socket服务器<试图3次>失败");
return false;
}
else
{
i=0;
TRACE0("重新连接socket服务器<试图3次>成功");
return true;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -