解决方案 »
- 关于listview 中加图标,图标总是居左,有什么方法居中吗
- 快70周年了,勿忘国耻
- 急用,vs2005中工具栏按钮如何做消息响应函数?
- 【高分求助】如何知道一个窗口何时绘制完毕???
- vc里一个cstring用双引号定义的时候,若定义的字符串里有双引号,编译的时候就会出错,该怎么办呢?
- Unicode转GB2312,用VC6编译,大家帮我看看是什么错误?
- 如何把现有的图标作为按钮插入到工具栏的按钮?
- WinXP装SP1和IE6的服务包后,MSDN频繁崩溃,这个问题不知道大家遇到过吗?怎样解决的?
- 请问怎样把MDI的主框架做成分裂窗口。
- vc++里怎样读取一个以包含ASCII码0000的字符串?
- 网络通信好深呀。//sip协议与socket有关系吗?
- 为什么每次绘制窗口的时候都要重新拿一次HDC?
用WSAStartup()初始化soocket send recv发送信息堵塞一段时间 accept链接堵塞一段时间 ?
用WSAAsync初使化 send recv发生信息非堵塞 accept链接非堵塞 ?
2)如何得到网络事件通知,要么用 轮询模式,要么用事件驱动模式。
3)同步通讯/异步通讯,这是网络通讯协议中的物理层和数据链路层关心的事情。
你说的socket异步通讯问题,应该是指WSAAsyncSelect()调用,也属于网络事件获取的模型中的事件驱动范畴。网络事件获取 无外乎轮询模式和事件驱动模式。
轮询模式要使用select()调用:
while (1) {
if (select()) { ... }
Sleep(50);
}事件驱动模式:可以使用Windows消息通知
调用 WSAAsyncSelect(socket, hWnd, WM_USER_SOCK, ...),如果有多个socket,可定义多个消息ID
然后在消息循环中响应WM_USER_SOCK消息进行处理。事件驱动模式:或者使用WSAEVENT事件通知
调用 WSAEventSelect()
然后WSAWaitForMultipleEvents() 等待WSAEVENT事件;参考 http://blog.csdn.net/hellomike/article/details/5524207
WSAAsyncSelect 和WSAEventSelect的用法
//大哥这个帖子里说的异步是指的是? if((AcceptSocket = accept(ListenSocket, NULL, NULL)) != INVALID_SOCKET)
154 {
155 // 设置套接字AcceptSocket为非阻塞模式
156 // 这样服务器在调用WSASend()函数发送数据时就不会被阻塞
157 NonBlock = 1;
158 if(ioctlsocket(AcceptSocket, FIONBIO, &NonBlock) == SOCKET_ERROR)
159 {
160 printf("ioctlsocket() failed with error %d\n", WSAGetLastError());
161 return -1;
162 } 你说的socket异步通讯问题,应该是指WSAAsyncSelect()调用,也属于网络事件获取的模型中的事件驱动范畴。网络事件获取 无外乎轮询模式和事件驱动模式。
轮询模式要使用select()调用:
while (1) {
if (select()) { ... }
Sleep(50);
}事件驱动模式:可以使用Windows消息通知
调用 WSAAsyncSelect(socket, hWnd, WM_USER_SOCK, ...),如果有多个socket,可定义多个消息ID
然后在消息循环中响应WM_USER_SOCK消息进行处理。事件驱动模式:或者使用WSAEVENT事件通知
调用 WSAEventSelect()
然后WSAWaitForMultipleEvents() 等待WSAEVENT事件;参考 http://blog.csdn.net/hellomike/article/details/5524207
WSAAsyncSelect 和WSAEventSelect的用法
client端根本就没有用轮询,也没有用事件驱动,只是用while循环不断的阻塞发送、阻塞接收数据。
非堵塞是发送消息 不等待发送成功就返回,堵塞是发送消息,等待发送成功就返回。
在这个帖子里根本没有看到“异步”处理的代码。server端用的是 while(TRUE){ if select() ... },实际上是轮询模式。
client端根本就没有用轮询,也没有用事件驱动,只是用while循环不断的阻塞发送、阻塞接收数据。
windows下使用WSAASYNC*封装起来比较简单点,随便学下IO完成端口模型
client端根本就没有用轮询,也没有用事件驱动,只是用while循环不断的阻塞发送、阻塞接收数据。
没事,一起讨论吧。是的。ioctlsocket(..., FIONBIO,...)用于设置socket处理blocking或者nonblocking模式,这会影响connect accept send recv的运行特性。
nonblocking模式下,connect会立即返回SOCKET_ERROR错误且WSAGetLastError 返回WSAEWOULDBLOCK,详见msdn.我看MSDN里强调的主要是blocking/nonblocking,没有看到关于socket中的同步异步的明确说法。我理解所谓socket通讯的异步模式,应该是指使用了WSAAsyncSelect()。Async前缀的意思是异步。那这个"异步"WSAAsyncSelect应该是相对于传统的所谓"同步"select()而言的。调用了WSAAsyncSelect,就意味着程序应该采用事件驱动模式获取socket事件通知,而不需要去select轮询.
那用wsastarup + 事件驱动算什么通信方式?
那用wsastarup + select 相当于异步通信?还有异步/同步是说服务器与客户端之间是否同步?那堵塞/非堵塞是说发送/接收函数是发送消息 等待/不等待 成功与否。在这个帖子里根本没有看到“异步”处理的代码。server端用的是 while(TRUE){ if select() ... },实际上是轮询模式。
client端根本就没有用轮询,也没有用事件驱动,只是用while循环不断的阻塞发送、阻塞接收数据。
没事,一起讨论吧。是的。ioctlsocket(..., FIONBIO,...)用于设置socket处理blocking或者nonblocking模式,这会影响connect accept send recv的运行特性。
nonblocking模式下,connect会立即返回SOCKET_ERROR错误且WSAGetLastError 返回WSAEWOULDBLOCK,详见msdn.我看MSDN里强调的主要是blocking/nonblocking,没有看到关于socket中的同步异步的明确说法。我理解所谓socket通讯的异步模式,应该是指使用了WSAAsyncSelect()。Async前缀的意思是异步。那这个"异步"WSAAsyncSelect应该是相对于传统的所谓"同步"select()而言的。调用了WSAAsyncSelect,就意味着程序应该采用事件驱动模式获取socket事件通知,而不需要去select轮询.
我确实不清楚什么是SOCKET同步模式,我一般用轮询/非轮询来划分SOCKET程序的工作模式。WSAStartup是Windows Sockets应用必须调用的,与轮询/非轮询、同步异步、阻塞不阻塞无关。“异步/同步”绝对不是说服务器与客户端之间是否同步。
是的,“堵塞/非堵塞”是指是否等待操作完成。非阻塞时,API立即返回,不等待操作完成。之后SOCKET协议栈会产生一个select事件通知我们这个API的执行结果。