没有合适的资源?快使用搜索试试~ 我知道了~
非阻塞recvfrom的设置
需积分: 33 13 下载量 187 浏览量
2012-03-28
09:17:19
上传
评论
收藏 72KB DOC 举报
温馨提示
试读
12页
Ioctlsocket() 简述: 控制套接口的模式。 #include <winsock.h> int PASCAL FAR ioctlsocket( SOCKET s, long cmd, u_long FAR* argp); s:一个标识套接口的描述字。 cmd:对套接口s的操作命令。 argp:指向cmd命令所带参数的指针。
资源推荐
资源详情
资源评论
int iMode = 1; //0:阻塞
ioctlsocket(socketc,FIONBIO, (u_long FAR*) &iMode);//非阻
塞设置
rs=recvfrom(socketc,rbuf,sizeof(rbuf),0,
(SOCKADDR*)&addr,&len);
疑问:设置成非阻塞后 recvfrom 就一直返回-1,请达人赐教
Ioctlsocket()
简述:
控制套接口的模式。
#include <winsock.h>
int PASCAL FAR ioctlsocket( SOCKET s, long cmd, u_long FAR*
argp);
s:一个标识套接口的描述字。
cmd:对套接口 s 的操作命令。
argp:指向 cmd 命令所带参数的指针。
注释:
本函数可用于任一状态的任一套接口。它用于获取与套接口相关的操作参
数,而与具体协议或通讯子系统无关。支持下列命令:
FIONBIO:允许或禁止套接口 s 的非阻塞模式。argp 指向一个无符号长整
型。如允许非阻塞模式则非零,如禁止非阻塞模式则为零。当创建一个套接口
时,它就处于阻塞模式(也就是说非阻塞模式被禁止)。这与 BSD 套接口是一
致的。WSAAsynSelect()函数将套接口自动设置为非阻塞模式。如果已对一个套
接口进行了 WSAAsynSelect() 操作,则任何用 ioctlsocket()来把套接口重新设置
成阻塞模式的试图将以 WSAEINVAL 失败。为了把套接口重新设置成阻塞模式,
应 用 程 序 必 须 首 先 用 WSAAsynSelect() 调 用 ( IEvent 参 数 置 为 0 ) 来 禁 至
WSAAsynSelect()。
FIONREAD:确定套接口 s 自动读入的数据量。argp 指向一个无符号长整
型,其中存有 ioctlsocket()的返回值。如果 s 是 SOCKET_STREAM 类型,则
FIONREAD 返回在一次 recv()中所接收的所有数据量。这通常与套接口中排队
的数据总量相同。如果 S 是 SOCK_DGRAM 型,则 FIONREAD 返回套接口上
排队的第一个数据报大小。
SIOCATMARK:确实是否所有的带外数据都已被读入。这个命令仅适用于
SOCK_STREAM 类型的套接口,且该套接口已被设置为可以在线接收带外数据
(SO_OOBINLINE)。如无带外数据等待读入,则该操作返回 TRUE 真。否
则的话返回 FALSE 假,下一个 recv()或 recvfrom()操作将检索“标记”前一些或所
有数据。应用程序可用 SIOCATMARK 操作来确定是否有数据剩下。如果在“紧
急”(带外)数据前有常规数据,则按序接收这些数据(请注意,recv()和
recvfrom()操作不会在一次调用中混淆常规数据与带外数据)。argp 指向一个
BOOL 型数,ioctlsocket()在其中存入返回值。
兼容性:
本 函 数 为 Berkeley 套 接 口 函 数 ioctl() 的 一 个 子 集 。 其 中 没 有 与
FIOASYNC 等价的命令,SIOCATMARK 是套接口层次支持的唯一命令。
返回值:
成功后,ioctlsocket()返回 0。否则的话,返回 SOCKET_ERROR 错误
应用程序可通过 WSAGetLastError()获取相应错误代码。
错误代码:
WSANOTINITIALISED : 在 使 用 此 API 之 前 应 首 先 成 功 地 调 用
WSAStartup()。
WSAENETDOWN:WINDOWS 套接口实现检测到网络子系统失效。
WSAEINVAL:cmd 为非法命令,或者 argp 所指参数不适用于该 cmd
命令,或者该命令不适用于此种类型的套接口。
WSAEINPROGRESS:一个阻塞的 WINDOWS 套接口调用正在运行中。
WSAENOTSOCK:描述字不是一个套接口。
参见:
socket(), setsockopt(), getsockopt(), WSAAsyncSelect().
Socket 阻塞和非阻塞的区别
简单点说:
阻塞就是干不完不准回来,æææ
非组赛就是你先干,我现看看有其他事没有,完了告诉我一声。
我们拿最常用的 send 和 recv 两个函数来说吧...
比如你调用 send 函数发送一定的 Byte,在系统内部 send 做的工作其实只是 把数
据传输(Copy)到 TCP/IP 协议栈的输出缓冲区,它执行成功并不代表数据已经成功
的发送出去了,如果 TCP/IP 协议栈没有足够的可用缓冲区来 保存你 Copy 过来的
数据的话...这时候就体现出阻塞和非阻塞的不同之处了:对于阻塞模式的 socket
send 函数将不返回直到系统缓冲区有足够的空间把你要发送的数据 Copy 过去以
后才返回,而对于非阻塞的 socket 来说 send 会立即返回 WSAEWOULDDBLOCK
告诉调用者说:"发送操作被阻塞了!!!你想办法处理吧..."
对于 recv 函数,同样道理,该函数的内部工 作机制其实是在等待 TCP/IP 协议栈的
接收缓冲区通知它说:嗨,你的数据来了.对于阻塞模式的 socket 来说如果 TCP/IP
协议栈的接收缓冲区没有 通知一个结果给它它就一直不返回:耗费着系统资源....
对 于 非 阻 塞 模 式 的 socket 该 函 数 会 马 上 返 回 , 然 后 告 诉
你:WSAEWOULDDBLOCK---"现在没有数据,回头在来看看"
在进行网络编程时,我们常常见到同步、异步、阻塞和非阻塞四种调用方式。
这些方式彼此概念并不好理解。下面是我对这些术语的理解。
同步
55555 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不
返回。按照这个定义,其实绝大多数函数都是同步调用(例如 sin, isdigit 等)。
但是一般而言,我们在说同步、异步的时候,特指那些需要其他部件协作或者
需要一定时间完成的任务。最常见的例子就是 SendMessage。该函数发送一个
消息给某个窗口,在对方处理完消息之前,这个函数不返回。当对方处理完毕
以后,该函数才把消息处理函数所返回的 LRESULT 值返回给调用者。
异步
55555 异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到
结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用
者。以 CAsycSocket 类为例(注意,CSocket 从 CAsyncSocket 派生,但是起功
能已经由异步转化为同步),当一个客户端通过调用 Connect 函数发出一个连
接请求后,调用者线程立刻可以朝下运行。当连接真正建立起来以后,socket
底层会发送一个消息通知该对象。这里提到执行 部件和调用者通过三种途径返
回结果:状态、通知和回调。可以使用哪一种依赖于执行部件的实现,除非执
行部件提供多种选择,否则不受调用者控制。如果执行部 件用状态来通知,那
么调用者就需要每隔一定时间检查一次,效率就很低(有些初学多线程编程的
人,总喜欢用一个循环去检查某个变量的值,这其实是一种很严重 的错误)。
如果是使用通知的方式,效率则很高,因为执行部件几乎不需要做额外的操作。
至于回调函数,其实和通知没太多区别。
阻塞
5555 阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果
之后才会返回。有人也许会把阻塞调用和同步调用等同起来,实际上他是不同
的。对于同 步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函
数没有返回而已。例如,我们在 CSocket 中调用 Receive 函数,如果缓冲区中没
有数 据,这个函数就会一直等待,直到有数据才返回。而此时,当前线程还会
继续处理各种各样的消息。如果主窗口和调用函数在同一个线程中,除非你在
特殊的界面操 作函数中调用,其实主界面还是应该可以刷新。socket 接收数据
的另外一个函数 recv 则是一个阻塞调用的例子。当 socket 工作在阻塞模式的时
候, 如果没有数据的情况下调用该函数,则当前线程就会被挂起,直到有数据
为止。
非阻塞
55555 非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞
当前线程,而会立刻返回。
对象的阻塞模式和阻塞函数调用
对 象是否处于阻塞模式和函数是不是阻塞调用有很强的相关性,但是并不是一
一对应的。阻塞对象上可以有非阻塞的调用方式,我们可以通过一定的 API 去
轮询状 态,在适当的时候调用阻塞函数,就可以避免阻塞。而对于非阻塞对象,
调用特殊的函数也可以进入阻塞调用。函数 select 就是这样的一个例子。
阻塞通信
通过重叠通信和计算在许多系统能提高性能。由一个智能通信控制器自动地执
行通信的系统是真实的。轻-重线索是取得这 种重叠的一种机制。导致好性能
剩余11页未读,继续阅读
资源评论
liushi558
- 粉丝: 105
- 资源: 17
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功