socket同步与异步
来源:互联网 发布:数据安全领域 编辑:程序博客网 时间:2024/05/03 01:22
前面说了socket建立与传输的函数,但是光这些函数,还不能达到网络通信程序的全部要求。因为accept, send和recv函数默认是同步的,也就是阻塞的。send还好说,发不出去就等着,有情可原。但是,accept和recv阻塞,通常会有麻烦,一个服务器程序,在试图接受连接(调用accept)之后, 由于没有客户端试图连接,所以服务器将进入阻塞状态,不能接受其他任何消息,包括用户输入,和窗口消息(如果有窗口的话),这是不可取的。操作人员也许会认为程序已经死了,而强行结束程序。recv也一样会遇到这个问题。
int PASCAL FAR ioctlsocket( SOCKET s, long cmd, u_long FAR* argp);
阻塞状态改变时第二个参数为FIONBIO,argp指向一个无符号长整型。如允许非阻塞模式则非零,如禁止非阻塞模式则为零。
fd_set rfds; //描述符集合
FD_ZERO(&rfds); //清空集合
FD_SET(socket, &rfds); //将socket加入到集合中, 0是标准输入句柄,加入后可以在等待socket时兼顾用户输入
FD_ISSET(0, &rfds)
应用举例
退之前需要调用WSACleanup()释放资源。
hEventObject:一个句柄,用于标识与所提供的FD_XXX网络事件集合相关的一个事件对象。
lNetworkEvents:一个屏蔽位,用于指定感兴趣的FD_XXX网络事件组合, 比如FD_READ | FD_CLOSE。
返回值:如果应用程序指定的网络事件及其相应的事件对象成功设置,则返回0。否则的话,将返回INVALID_SOCKET错误,应用程序可通过WSAGetLastError()来获取相应的错误代码。
cEvents:等候事件的总数量;
lphEvents:事件数组的指针;
fWaitAll:如果设置为 TRUE,则事件数组中所有事件被传信的时候函数才会返回, FALSE则任何一个事件被传信函数都要返回;
dwTimeout : 超时时间,如果超时,函数会返回 WSA_WAIT_TIMEOUT。如果设置为0,函数会立即返回。 如果设置为 WSA_INFINITE只有在某一个事件被传信后才会返回。
fAlertable
返回值:WSA_WAIT_TIMEOUT :最常见的返回值,我们需要做的就是继续Wait; WSA_WAIT_FAILED :出现了错误,请检查cEvents和lphEvents两个参数是否有效。如果事件数组中有某一个事件被传信了,函数会返回这个事件的索引值,但是这个索引值需要减去预定义值 WSA_WAIT_EVENT_0才是这个事件在事件数组中的位置。
hEventObject:用于标识需要复位的相应事件对象。
lpNetworkEvents:一个WSANETWORKEVENTS结构的数组,每一个元素记录了一个网络事件和相应的错误代码。
lpiCount:数组中的元素数目。可省。
调用该函数后,用NetworkEvents.lNetworkEvents & FD_XXX判断消息类型,进行处理。
别忘了用BOOL WSACloseEvent(WSAEVENT hEvent);关闭事件。
int PASCAL FAR WSAAsyncSelect ( SOCKET s, HWND hWnd, unsigned int wMsg,
hWnd:标识一个在网络事件发生时需要接收消息的窗口句柄。
wMsg:在网络事件发生时要接收的消息。
lEvent:位屏蔽码,用于指明应用程序感兴趣的网络事件集合。
窗口要处理消息,需要在窗口的消息映射(MESSAGE_MAP)中加入
ON_MESSAGE(NETWORK_EVENT, OnNetEvent)
- Socket 同步与异步
- 同步与异步Socket
- socket同步与异步
- 同步与异步Socket
- socket同步与异步
- socket同步与异步
- 同步与异步Socket
- socket同步与异步
- 同步与异步Socket
- 同步与异步Socket
- 异步SOCKET与同步SOCKET
- 【Unity】Socket 同步与异步
- Socket同步通信与异步通信
- SOCKET同步与异步的理解
- Socket同步、异步与阻塞、非阻塞
- Socket同步异步通信
- socket同步异步
- Socket同步异步学习
- PCB设计过程技术总结
- 为什么有些库的头文件只提供类的预先声明,而无类的定义?
- Java 推荐读物与源代码阅读
- C语言指针强制类型转换
- 线性判别分析(Linear Discriminant Analysis, LDA)算法分析
- socket同步与异步
- T-SQL技术收集——删除重复数据
- php实现手机拍照上传头像功能
- 常用sql语句锦集
- list_splice_tail
- Android电话系统之-rild
- PHP 生成xml
- linux rpm命令详解
- 每天一个Linux命令-----mkdir