socket 中的超时处理笔记(其中也有 MFC 的CAsyncSocket和CSocket类 )
2010-03-24 09:10
302 查看
1.在我们直接调用socket创建时,如果不进行特意声明的话,创建的socket都是阻塞的。这样当我们调用accept,recv时,将有可
能“block”,如果想设置为非阻塞,则方法有调用fcntl,select,WSAAsynSelect 来改变socket的阻塞
hsocket
= socket(AF_INET, SOCK_STREAM, 0)
fcntl(hsocket, F_SETFL,
0_NONBLOCK);
注意:
其中fcntl是Unix系统环境中使用的,使用ioctl()函数和fcntl()函数实现对套接字的控制,而在Windows系统中则应使用
ioctlsocket()函数。
Ioctl和fcntl的区别是:
ioctl -
control device
ioctl() performs a variety of
control functions on devices
and
STREAMS. For non-STREAMS files, the functions performed
by this call are device-specific control functions.
request
and an optional third argument
with varying type are passed
to the file
designated by fildes and are interpreted by the
device driver.
The fcntl() function provides
control of open file descriptors. It is similar to
ioctl().
(
这些带着unix的体味的函数,看着就头大。这个我是摘自某个文档,设置超时应该采用ioctlsocket。)
1.调用MFC的CAsyncSocket和CSocket类
MFC提供了两个类CAsyncSocket和CSocket来封装WinSock API,
CAsyncSocket在较低层次上封装了WinSock
API,缺省情况下,使用该类创建的socket是非阻塞的socket,所有操作都会立即返回,如果没有得到结果,返回WSAEWOULDBLOCK,
表示是一个阻塞操作。
CSocket建立在CAsyncSocket的基础上,是CAsyncSocket的派生类。也就是缺省情况下使用该类创建的socket是非阻塞的
socket,但是CSocket的网络I/O是阻塞的,它在完成任务之后才返回。CSocket的阻塞不是建立在“阻塞”socket的基础上,而是在
“非阻塞”socket上实现的阻塞操作,在阻塞期间,CSocket实现了本线程的消息循环,因此,虽然是阻塞操作,但是并不影响消息循环,即用户仍然
可以和程序交互。(即程序不会freeze)。
其中设置超时函数如下:
CAsyncSocket::SetSockOpt(
int nOptionName, const void* lpOptionValue, int
nOptionLen, int nLevel = SOL_SOCKET );
nOptionName用SO_SNDTIMEO or SO_RCVTIMEO。
能“block”,如果想设置为非阻塞,则方法有调用fcntl,select,WSAAsynSelect 来改变socket的阻塞
hsocket
= socket(AF_INET, SOCK_STREAM, 0)
fcntl(hsocket, F_SETFL,
0_NONBLOCK);
注意:
其中fcntl是Unix系统环境中使用的,使用ioctl()函数和fcntl()函数实现对套接字的控制,而在Windows系统中则应使用
ioctlsocket()函数。
Ioctl和fcntl的区别是:
ioctl -
control device
ioctl() performs a variety of
control functions on devices
and
STREAMS. For non-STREAMS files, the functions performed
by this call are device-specific control functions.
request
and an optional third argument
with varying type are passed
to the file
designated by fildes and are interpreted by the
device driver.
The fcntl() function provides
control of open file descriptors. It is similar to
ioctl().
(
这些带着unix的体味的函数,看着就头大。这个我是摘自某个文档,设置超时应该采用ioctlsocket。)
1.调用MFC的CAsyncSocket和CSocket类
MFC提供了两个类CAsyncSocket和CSocket来封装WinSock API,
CAsyncSocket在较低层次上封装了WinSock
API,缺省情况下,使用该类创建的socket是非阻塞的socket,所有操作都会立即返回,如果没有得到结果,返回WSAEWOULDBLOCK,
表示是一个阻塞操作。
CSocket建立在CAsyncSocket的基础上,是CAsyncSocket的派生类。也就是缺省情况下使用该类创建的socket是非阻塞的
socket,但是CSocket的网络I/O是阻塞的,它在完成任务之后才返回。CSocket的阻塞不是建立在“阻塞”socket的基础上,而是在
“非阻塞”socket上实现的阻塞操作,在阻塞期间,CSocket实现了本线程的消息循环,因此,虽然是阻塞操作,但是并不影响消息循环,即用户仍然
可以和程序交互。(即程序不会freeze)。
其中设置超时函数如下:
CAsyncSocket::SetSockOpt(
int nOptionName, const void* lpOptionValue, int
nOptionLen, int nLevel = SOL_SOCKET );
nOptionName用SO_SNDTIMEO or SO_RCVTIMEO。
相关文章推荐
- Lighttpd1.4.20源码分析 笔记 fdevent系统-连接socket及超时处理
- Unity3D笔记——Socket粘包分包的理解和最简单的处理方式
- OpenCV学习笔记(三):将图像显示在MFC控件上并做直方图均衡化处理
- MFC中设置socket超时
- Socket网络编程学习笔记(4):TCP消息边界处理
- 网络的connect如何超时设置?MFC socket异步 timeout select
- MFC SOCKET基础(六) CAsyncSocket 与 CSocket
- 在MFC 子线程中使用UI(控件)退出时死锁或者超时处理参考
- C++MFC编程笔记day01 MFC介绍、创建MFC程序和重写消息处理
- 处理Python中urllib2/mechanize库进行socket通信超时的问题
- MFC中socket编程时recv设置超时属性后,如果超时返回值是什么?
- 达内学习笔记——MFC消息处理
- ACE笔记(3)-用 ACE_Reactor 实现SOCKET事件处理
- vc++/mfc socket网络通信多客户端和服务端安全问题,服务端只处理授权客户端
- MFC小笔记之Socket套接字
- MFC socket 学习笔记
- Linux socket之三:面向无连接的socket通信&&sokcet超时处理
- 【VS2010学习笔记】【异常处理】二(VS2008/VS2010中MFC“资源被另一个编辑器打开”)
- 【VS2010学习笔记】【函数学习】一(MFC+OpenCV2.4.7读取摄像头之WM_TIMER消息处理函数的添加问题)
- MFC消息处理笔记