WSAEventselect模型中的一些注意事项(尤其是event和事件的关联与重置;FD_WRITE事件的作用)

 

1. 需要包含winsock2.h,链接ws2_32.llib

 

2. 把#include <winsock2.h>放到最前面

至于原因,那是因为windows.h这个头文件已经包含了winsock.h,winsock.h和winsock2.h貌似有冲突  解释在:http://vc.ygman.com/thread/47071

 

3.MSDN中说使用WSAEventSelect模型等待时是不占cpu时间的,这也是效率比阻塞winsock高的原因;非阻塞模式可以省去send或者recv没有空间发送或没有数据接收时的等待时间;一个线程管理多个会话套接字;

 

4. 同一个事件会不会由于多个网络事件的集合,同时发生两个网络事件后被屏蔽?

用send做实验,发现会的。因为在TCP连接开始,会在服务器端的会话套接字上触发FD_WRITE事件。如果在会话套接字上监听FD_READ和FD_WRITE事件,会有如下两种情况。

第一、实验在客户端connect后中断,那么在服务器端就会在接听套接字接收到FD_ACCEPT事件,随后在创建的会话套接字上触发FD_WRITE事件,已经通过单步调试验证。

第二、如果在客户端send后中断,那么在服务器端首先还是在监听套接字接收到FD_ACCEPT事件,随后在创建的会话套接字上触发FD_WRITE事件,这个时候不同的是,由于客户端发送数据的缘故,会再这个会话套接字上再触发FD_READ事件。这时就会出现一个套接字上监听的多个网络事件同时触发的问题。因为此时会话套接字上触发了两个网络时间,但是在处理的时候WSAEnumNetworkEvents会自动重置这个事件,比如在处理的时候先处理的是FD_READ事件,过去之后这个event就会被重置,所以FD_WRITE时间就无法处理了;如果先处理的是FD_WRITE事件,过去之后这个event还是会被重置,所以这时FD_READ时间就得不到处理了。

 

 

5. FD_WIRTE事件的作用?

一直搞不懂 WSAEventSelect 的 FD_WRITE ,不知道怎么利用他在自己想发数据的时候发数据,后来知道了想发随时发消息 要自己另外去写send方法,FD_WRITE 是用于一开始连接成功侯就开始发送大批量数据的,比如发一个视频连接给别人 ,别人接了 那么这个时候就触发了FD_WRITE ,视频的数据会不停的充满缓存,所以FD_WRITE会不停的触发因为没人教我 只能靠自己苦苦参悟了 希望别的朋友也能看到我的文字,不要 去被 FD_WRITE 烦恼了  想自己随时发数据的时候 ,自己另外去写send方法 如果你不是一次性发送大批量数据的话,就别想着使用FD_WRITE事件了,因为如果既希望于在收到FD_WRITE的时候发送数据,但是又不能发送足够多的数据填满socket缓冲区的话,就只能收到刚刚建连接的时候的第一次事件,之后及不会再收到了,所以当只是发送尽可能少的数据的时候,忘掉FD_WRITE机制,在任何想发送数据的时候直接调用send发送吧。

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值