社区
C++ 语言
帖子详情
求C++下六种通讯模型的例子
ocean1004
2008-12-31 09:20:22
一:select模型
二:WSAAsyncSelect模型
三:WSAEventSelect模型
四:Overlapped I/O 事件通知模型
五:Overlapped I/O 完成例程模型
六:IOCP模型
****************************************
高手有的话,顺便贴一下。
只要核心部分就可以,伪代码也可,但是用到的api等关键函数请用原型,要不我恢复不过来。
最好是客户端和服务端都有~~~谢谢了~~~~~~
...全文
215
18
打赏
收藏
求C++下六种通讯模型的例子
一:select模型 二:WSAAsyncSelect模型 三:WSAEventSelect模型 四:Overlapped I/O 事件通知模型 五:Overlapped I/O 完成例程模型 六:IOCP模型 **************************************** 高手有的话,顺便贴一下。 只要核心部分就可以,伪代码也可,但是用到的api等关键函数请用原型,要不我恢复不过来。 最好是客户端和服务端都有~~~谢谢了~~~~~~
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
18 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
帅得不敢出门
2008-12-31
打赏
举报
回复
http://download.csdn.net/sort/tag/WSAAsyncSelect
tianjiao85
2008-12-31
打赏
举报
回复
google不一定有这效果。mark
ocean1004
2008-12-31
打赏
举报
回复
WSAEventSelect模型
最后一个这个了,异步的我看下MFC就可以了
我主要想问下大家他们的区别,但是想想还是自己直接看代码好了~~~~~~~描述不清楚自己疑问在哪里~~~~~~~~~
jieao111
2008-12-31
打赏
举报
回复
lz也要学会自己Google
wudeshou82666
2008-12-31
打赏
举报
回复
学习了
星羽
2008-12-31
打赏
举报
回复
http://www.cnblogs.com/baoli/archive/2008/03/03/1089271.html
Select模型
星羽
2008-12-31
打赏
举报
回复
http://blog.csdn.net/piggyxp/archive/2004/09/23/114883.aspx
http://blog.csdn.net/piggyxp/archive/2004/09/23/114908.aspx
重叠I/O
星羽
2008-12-31
打赏
举报
回复
http://files.cnblogs.com/baoli/winsockclass.rar
IOCP的c++例子
ocean1004
2008-12-31
打赏
举报
回复
主要是看不懂网上对六种模型的描述,所以要代码。
但好像也不能从代码看出这几种模型的形状?因为都被windows封装在他自己的函数里?
snailman
2008-12-31
打赏
举报
回复
[Quote=引用 2 楼 Chiyer 的回复:]
http://files.cnblogs.com/baoli/winsockclass.rar
IOCP的c++例子
[/Quote]
这个例子会挂掉
snailman
2008-12-31
打赏
举报
回复
[Quote=引用 2 楼 Chiyer 的回复:]
http://files.cnblogs.com/baoli/winsockclass.rar
IOCP的c++例子
[/Quote]
这个例子会挂掉
snailman
2008-12-31
打赏
举报
回复
[Quote=引用 2 楼 Chiyer 的回复:]
http://files.cnblogs.com/baoli/winsockclass.rar
IOCP的c++例子
[/Quote]
这个例子会挂掉
herman~~
2008-12-31
打赏
举报
回复
哦 这6种模型基本在 window网络编程 这本书里面都有提到,也有简单的例子
xiaoyisnail
2008-12-31
打赏
举报
回复
mark
jiangfeng999
2008-12-31
打赏
举报
回复
详细的做法楼主可以看一下:
http://bbs.zdnet.com.cn/thread-478719-1-1.html
china_west
2008-12-31
打赏
举报
回复
继续关注
jiangfeng999
2008-12-31
打赏
举报
回复
二:WSAAsyncSelect模型
后来,老陈使用了微软公司的新式信箱。这种信箱非常先进,一旦信箱里有新的信件,盖茨就会给老陈打电话:喂,大爷,你有新的信件了!从此,老陈再也不必频繁上下楼检查信箱了,牙也不疼了,你瞅准了,蓝天......不是,微软~~~~~~~~
微软提供的WSAAsyncSelect模型就是这个意思。
WSAAsyncSelect模型是Windows下最简单易用的一种Socket I/O模型。使用这种模型时,Windows会把网络事件以消息的形势通知应用程序。
首先定义一个消息标示常量:
const WM_SOCKET = WM_USER + 55;
再在主Form的private域添加一个处理此消息的函数声明:
private
procedure WMSocket(var Msg: TMessage); message WM_SOCKET;
然后就可以使用WSAAsyncSelect了:
var
addr : TSockAddr;
sock : TSocket;
sock := socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
addr.sin_family := AF_INET;
addr.sin_port := htons(5678);
addr.sin_addr.S_addr := htonl(INADDR_ANY);
bind( m_sock, @addr, sizeof(SOCKADDR) );
WSAAsyncSelect( m_sock, Handle, WM_SOCKET, FD_ACCEPT or FD_CLOSE );
listen( m_sock, 5 );
....
应用程序可以对收到WM_SOCKET消息进行分析,判断是哪一个socket产生了网络事件以及事件类型:
procedure TfmMain.WMSocket(var Msg: TMessage);
var
sock : TSocket;
addr : TSockAddrIn;
addrlen : Integer;
buf : Array [0..4095] of Char;
begin
//Msg的WParam是产生了网络事件的socket句柄,LParam则包含了事件类型
case WSAGetSelectEvent( Msg.LParam ) of
FD_ACCEPT :
begin
addrlen := sizeof(addr);
sock := accept( Msg.WParam, addr, addrlen );
if sock INVALID_SOCKET then
WSAAsyncSelect( sock, Handle, WM_SOCKET, FD_READ or FD_WRITE or FD_CLOSE );
end;
FD_CLOSE : closesocket( Msg.WParam );
FD_READ : recv( Msg.WParam, buf[0], 4096, 0 );
FD_WRITE : ;
end;
end;
jiangfeng999
2008-12-31
打赏
举报
回复
二:WSAAsyncSelect模型
后来,老陈使用了微软公司的新式信箱。这种信箱非常先进,一旦信箱里有新的信件,盖茨就会给老陈打电话:喂,大爷,你有新的信件了!从此,老陈再也不必频繁上下楼检查信箱了,牙也不疼了,你瞅准了,蓝天......不是,微软~~~~~~~~
微软提供的WSAAsyncSelect模型就是这个意思。
WSAAsyncSelect模型是Windows下最简单易用的一种Socket I/O模型。使用这种模型时,Windows会把网络事件以消息的形势通知应用程序。
首先定义一个消息标示常量:
const WM_SOCKET = WM_USER + 55;
再在主Form的private域添加一个处理此消息的函数声明:
private
procedure WMSocket(var Msg: TMessage); message WM_SOCKET;
然后就可以使用WSAAsyncSelect了:
var
addr : TSockAddr;
sock : TSocket;
sock := socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
addr.sin_family := AF_INET;
addr.sin_port := htons(5678);
addr.sin_addr.S_addr := htonl(INADDR_ANY);
bind( m_sock, @addr, sizeof(SOCKADDR) );
WSAAsyncSelect( m_sock, Handle, WM_SOCKET, FD_ACCEPT or FD_CLOSE );
listen( m_sock, 5 );
....
应用程序可以对收到WM_SOCKET消息进行分析,判断是哪一个socket产生了网络事件以及事件类型:
procedure TfmMain.WMSocket(var Msg: TMessage);
var
sock : TSocket;
addr : TSockAddrIn;
addrlen : Integer;
buf : Array [0..4095] of Char;
begin
//Msg的WParam是产生了网络事件的socket句柄,LParam则包含了事件类型
case WSAGetSelectEvent( Msg.LParam ) of
FD_ACCEPT :
begin
addrlen := sizeof(addr);
sock := accept( Msg.WParam, addr, addrlen );
if sock INVALID_SOCKET then
WSAAsyncSelect( sock, Handle, WM_SOCKET, FD_READ or FD_WRITE or FD_CLOSE );
end;
FD_CLOSE : closesocket( Msg.WParam );
FD_READ : recv( Msg.WParam, buf[0], 4096, 0 );
FD_WRITE : ;
end;
end;
本贴来自ZDNetChina中文社区 http://bbs.zdnet.com.cn ,本贴地址:http://bbs.zdnet.com.cn/viewthread.php?tid=478719
jiangfeng999
2008-12-31
打赏
举报
回复
提供一种比较幽默的说法:
1.
一:select模型
老陈非常想看到女儿的信。以至于他每隔10分钟就下楼检查信箱,看是否有女儿的信~~~~~
在这种情况下,"下楼检查信箱"然后回到楼上耽误了老陈太多的时间,以至于老陈无法做其他工作。
select模型和老陈的这种情况非常相似:周而复始地去检查......如果有数据......接收/发送.......
使用线程来select应该是通用的做法:
procedure TListenThread.Execute;
var
addr : TSockAddrIn;
fd_read : TFDSet;
timeout : TTimeVal;
ASock,
MainSock : TSocket;
len, i : Integer;
begin
MainSock := socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
addr.sin_family := AF_INET;
addr.sin_port := htons(5678);
addr.sin_addr.S_addr := htonl(INADDR_ANY);
bind( MainSock, @addr, sizeof(addr) );
listen( MainSock, 5 );
while (not Terminated) do
begin
FD_ZERO( fd_read );
FD_SET( MainSock, fd_read );
timeout.tv_sec := 0;
timeout.tv_usec := 500;
if select( 0, @fd_read, nil, nil, @timeout ) > 0 then //至少有1个等待Accept的connection
begin
if FD_ISSET( MainSock, fd_read ) then
begin
for i:=0 to fd_read.fd_count-1 do //注意,fd_count INVALID_SOCKET then
....//为ASock创建一个新的线程,在新的线程中再不停地select
end;
end;
end;
end; //while (not self.Terminated)
shutdown( MainSock, SD_BOTH );
closesocket( MainSock );
end;
本贴来自ZDNetChina中文社区 http://bbs.zdnet.com.cn ,本贴地址:http://bbs.zdnet.com.cn/viewthread.php?tid=478719
【QT】串口
通讯
demo分享
程序已经通过测试,内含源码和exe文件 添加链接描述
C++
socket 网络编程 简单聊天室
操作系统里的进程
通讯
方式有6种:(有名/匿名)管道、信号、消息队列、信号量、内存(最快)、套接字(最常用),这里我们来介绍用socket来实现进程
通讯
。 1、简单实现一个单向发送与接收 这是套接字的工作流程 (对于有时间想慢慢看的推荐这篇博客:https://www.cnblogs.com/kefeiGame/p/7246942.html) (不想自己画一遍,直接用别人的) ...
千亿级IM独立开发指南丨全球即时
通讯
全套代码4小时速成(四):服务端搭建与总结
从零构建即时通信APP的亿点点细节——服务端搭建与总结
六种
常用排序算法的实现及其优化
2018-12-10-17:22:29 1.排序 定义 :排序是计算机内经常进行的一种操作,其目的是将一组“无序”的记录序列调整为“有序”的记录序列。分内部排序和外部排序,若整个排序过程不需要访问外存便能完成,则称此类排序问题为内部排序。反之,若参加排序的记录数量很大,整个序列的排序过程不可能在内存中完成,则称此类排序问题为外部排序。内部排序的过程是一个逐步扩大记录的有序序列长度的过程。...
boost asio 性能_Sogou
C++
Workflow:高性能
C++
服务器引擎
点击“蓝字”关注我们吧Sogou
C++
Workflow 是搜狗公司的
C++
服务器引擎,支撑搜狗几乎所有后端
C++
在线服务,包括所有搜索服务、云输入法与在线广告等,每日处理超百亿请
求
。这是一个设计轻盈优雅的企业级程序引擎,可以满足大多数
C++
后端开发需
求
。可以使用该项目:快速搭建http服务器:#include #include "workflow/WFHttpServer...
C++ 语言
65,211
社区成员
250,514
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章