客户端网络开发常见方法:
网络对象从底层分就2种:Acceptor ,Connector.
Acceptor:不断等待外面连接进来,然后创建Connector.
Connector:与外面进行数据传递。
send是否一般知道什么时候去send,但recv我们能难知道数据什么到来。我必须不停recv去检测数据是否到来或者等待网卡告诉我数据来了。如果不停recv或者阻塞recv就卡住当前线程要做别的事情,比喻我们网络逻辑是放UI的线程里面,如果我们不停的recv或者阻塞recv那么就阻塞主UI线程,因为UI线程也要不停的GetMessage做窗口消息分发。网络层基本几种状态无非是 可以发送',可以接收,可以Accept,主要3种,如果我们知道这基本3种状态,那就算我们在UI线程中也难阻塞线程,(只有在很极端情况下阻塞套接字会卡住)。
其实从上面看UI消息调度和网络调度差不多少,所以微软不是提供了 WSAAsyncSelect 把FD_CONNECT,FD_READ 等等融入在一个自定义消息中,当成一个窗口消息,融入在GetMessage的消息循环。
其实我们常说消息无非就是状态,以前一直不明白计算机就是状态机,后面看的书,写的代码多就明白一些了。
感觉万物是不停
在
do
{
switch(state)
{
case xx:
OnXXX();
break;
.........
}
}
while(true)
所以网络层首先的封装就是去封装网络状态机,剩下组包和分包,去触发真正任务层。这个就是基础的网络层封装了吧,剩下基本都是业务,无论是网络高并发还是网络吞吐都是业务,不是网络基础。
所以window下客户端网络常见写法:
1:WSAAsyncSelect---> 把网络状态机丢给UI线程去做。这种适合客户度只有少量几个长连接。所有都是通过服务器一个连接进行发送和接受。
2:线程 + 异步套接字 + select(这个不仅仅代表是select 这个IO函数,代表一类检测方法)-----------》自己组织网络的状态机。
参考vc++源代码:
蘑菇街开源IM(win客户端)
电骡开源代码
Shareaza源代码
windows还是有种就是完成端口进行封装,但好像是状态机丢给内核,应该说起来算是1种吧。
网络对象从底层分就2种:Acceptor ,Connector.
Acceptor:不断等待外面连接进来,然后创建Connector.
Connector:与外面进行数据传递。
send是否一般知道什么时候去send,但recv我们能难知道数据什么到来。我必须不停recv去检测数据是否到来或者等待网卡告诉我数据来了。如果不停recv或者阻塞recv就卡住当前线程要做别的事情,比喻我们网络逻辑是放UI的线程里面,如果我们不停的recv或者阻塞recv那么就阻塞主UI线程,因为UI线程也要不停的GetMessage做窗口消息分发。网络层基本几种状态无非是 可以发送',可以接收,可以Accept,主要3种,如果我们知道这基本3种状态,那就算我们在UI线程中也难阻塞线程,(只有在很极端情况下阻塞套接字会卡住)。
其实从上面看UI消息调度和网络调度差不多少,所以微软不是提供了 WSAAsyncSelect 把FD_CONNECT,FD_READ 等等融入在一个自定义消息中,当成一个窗口消息,融入在GetMessage的消息循环。
其实我们常说消息无非就是状态,以前一直不明白计算机就是状态机,后面看的书,写的代码多就明白一些了。
感觉万物是不停
在
do
{
switch(state)
{
case xx:
OnXXX();
break;
.........
}
}
while(true)
所以网络层首先的封装就是去封装网络状态机,剩下组包和分包,去触发真正任务层。这个就是基础的网络层封装了吧,剩下基本都是业务,无论是网络高并发还是网络吞吐都是业务,不是网络基础。
所以window下客户端网络常见写法:
1:WSAAsyncSelect---> 把网络状态机丢给UI线程去做。这种适合客户度只有少量几个长连接。所有都是通过服务器一个连接进行发送和接受。
2:线程 + 异步套接字 + select(这个不仅仅代表是select 这个IO函数,代表一类检测方法)-----------》自己组织网络的状态机。
参考vc++源代码:
蘑菇街开源IM(win客户端)
电骡开源代码
Shareaza源代码
windows还是有种就是完成端口进行封装,但好像是状态机丢给内核,应该说起来算是1种吧。