WinSock的同步异步、阻塞非阻塞问题
用了别人写得程序,但是没搞懂。。。
用的select模型,是不是就是同步的方式,那阻塞和非阻塞有是怎么判断的呢
Init里面就是连接和接收数据
接收数据里面开启了一个线程,并且有两个回调函数,一个状态一个数据
客户端线程
用的select模型,是不是就是同步的方式,那阻塞和非阻塞有是怎么判断的呢
Init里面就是连接和接收数据
TcpInit()
{
if (!m_bClientConnected)
{
int m_nPortRemote = 5025;
CString m_strRemoteIP = _T("192.168.1.58");
DWORD IP = inet_addr((LPCTSTR)m_strRemoteIP);
if(!m_pSockClient->Connect(m_strRemoteIP,m_nPortRemote))
{
int a=0;
return;
}
if(!m_pSockClient->StartReceiving(TcpStatusChangeCallBack,TcpRecvCallBack,(DWORD)this))
{
int a=0;
m_pSockClient->Close();
return;
}
m_bClientConnected=TRUE;
}
WriteCmd("FORMat:DATA INT,16\n",20);
}接收数据里面开启了一个线程,并且有两个回调函数,一个状态一个数据
StartReceiving(LPStatusProc proc1,LPDataArriveProc proc2,DWORD userdata)
{
if(!m_bAvailable)
{
return FALSE;
}
if(m_nType==TCP_SOCKET_SERVER)
{
return FALSE;
}
if(!m_bCreated)
{
return FALSE;
}
if(m_bAuto)
{
return FALSE;
}
//开始自动接收
m_lpClientStatusProc=proc1;
m_lpClientDataArriveProc=proc2;
m_dwUserData=userdata;
m_bAuto=TRUE;
DWORD dwThreadId;
m_hServerThread=CreateThread(NULL,0,ClientThread,this,0,&dwThreadId);
if(m_hServerThread==NULL)
{
m_bAuto=FALSE;
error=WSAGetLastError();
return FALSE;
}
return TRUE;
}客户端线程
ClientThread(LPVOID lpParameter)
{
CTCPSocket* m_pTCP=(CTCPSocket*)lpParameter;
int nRet;
char buf[256];
timeval tv={0,5000};
fd_set fs;
//不断接收服务器发来数据
while(m_pTCP->m_bAuto)
{
FD_ZERO(&fs);
FD_SET(m_pTCP->m_sSocket,&fs);
if(select(1,&fs,NULL,NULL,&tv)==1)
{
nRet=recv(m_pTCP->m_sSocket,buf,256,0);
if(nRet==SOCKET_ERROR)
{
//出错断开(例如服务器关闭)
m_pTCP->error=WSAGetLastError();
closesocket(m_pTCP->m_sSocket);
m_pTCP->m_bAuto=FALSE;
TRACE("客户端出错断开! \n");
//回调处理
if(m_pTCP->m_lpClientStatusProc!=NULL)
{
char* inf;
inf=new char[22];
inf[0]='C';
inf[1]='D';
m_pTCP->m_lpClientStatusProc(inf,22,m_pTCP->m_dwUserData);
delete inf;
}
break;
}
if(nRet>0)
{
//收到新的数据
//TRACE("客户端收到数据%d字节! \n",nRet);
//数据回调处理
if(m_pTCP->m_lpClientDataArriveProc!=NULL)
{
char* inf;
inf=new char[nRet];
memcpy(inf,buf,nRet);
m_pTCP->m_lpClientDataArriveProc(inf,nRet,m_pTCP->m_dwUserData);
delete inf;
}
continue;
}
if(nRet==0)
{
//服务器正常断开
TRACE("客户端正常断开! \n");
//回调处理
if(m_pTCP->m_lpClientStatusProc!=NULL)
{
char* inf;
inf=new char[22];
inf[0]='C';
inf[1]='D';
m_pTCP->m_lpClientStatusProc(inf,22,m_pTCP->m_dwUserData);
delete inf;
}
closesocket(m_pTCP->m_sSocket);
m_pTCP->m_bAuto=FALSE;
break;
}
}
}
return 0;
}
...全文
相关推荐
socket 多线程 例程 非阻塞模式
vc++6.0 编写socket多线程例程,非阻塞模式,客户端 服务器端源代码,可运行
VC异步多线程Socket服务端与客户端架构详解
网络编程中,同步阻塞模型在连接数增长后容易暴露线程膨胀、界面卡顿等问题,而异步与多线程分别解决事件监听和并行处理的矛盾。理解阻塞与非阻塞、select轮询、粘包半包处理等基础概念,是构建稳定通信架构的前提。通过事件驱动通知网络状态,用工作线程分离业务逻辑,能有效提升系统吞吐量并降低资源占用。这类方案广泛应用于实时通信、远程控制、数据采集等场景,尤其适合需要高并发连接和流畅UI交互的Windows桌面应用。本文以VC环境下异步多线程Socket服务端与客户端为线索,从架构设计、代码实现到常见坑点,系统拆解可落
WinSock 异步IO模型
WinSock 异步IO模型WinSock 异步IO模型
1_WINSOCK的I/O模型_
实现一个简易的群聊服务软件,该软件采用C/S模式
DTU如何通过socket实现网络通信.pdf
。。。


界面
