请问在事件选择模型中,FD_WRITE事件在什么时候被激发?

时间:2022-12-15 21:13:27
请问在事件选择模型中,FD_WRITE事件在什么时候被激发?

16 个解决方案

#1


socket 可以写 数据 的时候. 收到通知

#2


难道SOCKET可以发送数据的时候一起会激发此事件吗?
我测试过,并不是这样

#3


如果是tcp的话,连接完成之后,系统会自动产生一个FD_WRITE事件,告诉上层,可以进行数据发送了。

如果在这个FD_WRITE事件事件之后,没有投递send再重新向系统申请写操作。那么这个FD_WRITE事件在底层不会被删除,底层也不会向上层再发一个新的FD_WRITE事件

如果在这个FD_WRITE事件事件之后,投递send再重新向系统申请写操作。那么这个FD_WRITE事件在底层会被删除,底层会在端口可用的情况下会向上层再发一个新的FD_WRITE事件

#4


发送数据

#5


有数据到达是就会自动触发,也可以通过AsyncSelect(FD_WRITE);来触发FD_WRITE事件

#6


谢谢"飘人"的解答,很详细.
如果在连接完成后,程序不需要立即发送数据.按照你的说法:

"如果在这个FD_WRITE事件事件之后,没有投递send再重新向系统申请写操作。那么这个FD_WRITE事件在底层不会被删除,底层也不会向上层再发一个新的FD_WRITE事件"

那之后我要发送数据要怎么办呢?
直接send吗?这样的话,如何得知SOCKET是否可写?而且这样做,FD_WRITE事件就好像变得没什么意义了

#7


当然直接send

使用select判断,也是返回FD_WRITE,因为没有被删除,所以当然这个事件可用


FD_WRITE是说明可以发送数据,至于意义,要看怎么使用了

#8


也就是说要发送数据时不用现会FD_WRITE事件是否被激发,而是用select看是否可写,可写就直接用send.是这样吗?
那事件选择模型里的FD_WRITE事件还是没什么用哦

#9


我也觉得FD_WRITE事件没什么意义.

据我的理解select模型中FD_WRITE事件只果检查可写性!

#10


罗的那本WINASM有讲:
当缓冲区满的时候发不了东西,一旦缓冲区空出了一点 系统就发个FD_WRITE消息提示可以发数据了 如果满的时候还调用send是发不出去的

#11


总结下吧:有二个地方,会发生此事件
1.第一个连接成功,状态会有一个FD_WRITE事件
2.当send()发送太快,缓冲被满后如缓冲再次可用,状态会有一个FD_WRITE事件。
当有FD_WRITE事件被设置后,如用户调用send(),或检查此状态的函数(如select()等API),将清除此状态值。

#12


第1点不敢苟同  我没记错的话书上讲的是当调用WSASelect...(忘记怎么拼了 反正是select的windows版本)的时候会有一个FD_WRITE事件

但愿没记错

#13


其实select 返回FD_WRITE事件就是表示一个状态:现在可以发送数据了!正如其返回FD_READ表示有数据来了,可以接收数据了一样(接收的例子我分析的很仔细的),仅仅表示一个状态。

#14


FD_WRITE是表示可以发送数据没错.
问题是它是什么时候被激发,在事件选择模型中如何去利用这个事件

#15


FD_WRITE是表示可以发送数据没错.
问题是它是什么时候被激发,在事件选择模型中如何去利用这个事件
大家继续啊

#16


FD_WRITE有两种情况是会出现.
1.当connect()连接到远程时,会出现个FD_WRITE的事件
2.当系统缓冲区有空间,还可以处理更多数据(向外发送的数据)时,就会产生这个事件.一般就是发送数据,系统返回缓冲区已满的信息,然后等一会,缓冲区有空间可以处理更多数据时,这个事件就会被激发.

#1


socket 可以写 数据 的时候. 收到通知

#2


难道SOCKET可以发送数据的时候一起会激发此事件吗?
我测试过,并不是这样

#3


如果是tcp的话,连接完成之后,系统会自动产生一个FD_WRITE事件,告诉上层,可以进行数据发送了。

如果在这个FD_WRITE事件事件之后,没有投递send再重新向系统申请写操作。那么这个FD_WRITE事件在底层不会被删除,底层也不会向上层再发一个新的FD_WRITE事件

如果在这个FD_WRITE事件事件之后,投递send再重新向系统申请写操作。那么这个FD_WRITE事件在底层会被删除,底层会在端口可用的情况下会向上层再发一个新的FD_WRITE事件

#4


发送数据

#5


有数据到达是就会自动触发,也可以通过AsyncSelect(FD_WRITE);来触发FD_WRITE事件

#6


谢谢"飘人"的解答,很详细.
如果在连接完成后,程序不需要立即发送数据.按照你的说法:

"如果在这个FD_WRITE事件事件之后,没有投递send再重新向系统申请写操作。那么这个FD_WRITE事件在底层不会被删除,底层也不会向上层再发一个新的FD_WRITE事件"

那之后我要发送数据要怎么办呢?
直接send吗?这样的话,如何得知SOCKET是否可写?而且这样做,FD_WRITE事件就好像变得没什么意义了

#7


当然直接send

使用select判断,也是返回FD_WRITE,因为没有被删除,所以当然这个事件可用


FD_WRITE是说明可以发送数据,至于意义,要看怎么使用了

#8


也就是说要发送数据时不用现会FD_WRITE事件是否被激发,而是用select看是否可写,可写就直接用send.是这样吗?
那事件选择模型里的FD_WRITE事件还是没什么用哦

#9


我也觉得FD_WRITE事件没什么意义.

据我的理解select模型中FD_WRITE事件只果检查可写性!

#10


罗的那本WINASM有讲:
当缓冲区满的时候发不了东西,一旦缓冲区空出了一点 系统就发个FD_WRITE消息提示可以发数据了 如果满的时候还调用send是发不出去的

#11


总结下吧:有二个地方,会发生此事件
1.第一个连接成功,状态会有一个FD_WRITE事件
2.当send()发送太快,缓冲被满后如缓冲再次可用,状态会有一个FD_WRITE事件。
当有FD_WRITE事件被设置后,如用户调用send(),或检查此状态的函数(如select()等API),将清除此状态值。

#12


第1点不敢苟同  我没记错的话书上讲的是当调用WSASelect...(忘记怎么拼了 反正是select的windows版本)的时候会有一个FD_WRITE事件

但愿没记错

#13


其实select 返回FD_WRITE事件就是表示一个状态:现在可以发送数据了!正如其返回FD_READ表示有数据来了,可以接收数据了一样(接收的例子我分析的很仔细的),仅仅表示一个状态。

#14


FD_WRITE是表示可以发送数据没错.
问题是它是什么时候被激发,在事件选择模型中如何去利用这个事件

#15


FD_WRITE是表示可以发送数据没错.
问题是它是什么时候被激发,在事件选择模型中如何去利用这个事件
大家继续啊

#16


FD_WRITE有两种情况是会出现.
1.当connect()连接到远程时,会出现个FD_WRITE的事件
2.当系统缓冲区有空间,还可以处理更多数据(向外发送的数据)时,就会产生这个事件.一般就是发送数据,系统返回缓冲区已满的信息,然后等一会,缓冲区有空间可以处理更多数据时,这个事件就会被激发.