16 个解决方案
#1
socket 可以写 数据 的时候. 收到通知
#2
难道SOCKET可以发送数据的时候一起会激发此事件吗?
我测试过,并不是这样
我测试过,并不是这样
#3
如果是tcp的话,连接完成之后,系统会自动产生一个FD_WRITE事件,告诉上层,可以进行数据发送了。
如果在这个FD_WRITE事件事件之后,没有投递send再重新向系统申请写操作。那么这个FD_WRITE事件在底层不会被删除,底层也不会向上层再发一个新的FD_WRITE事件
如果在这个FD_WRITE事件事件之后,投递send再重新向系统申请写操作。那么这个FD_WRITE事件在底层会被删除,底层会在端口可用的情况下会向上层再发一个新的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事件就好像变得没什么意义了
如果在连接完成后,程序不需要立即发送数据.按照你的说法:
"如果在这个FD_WRITE事件事件之后,没有投递send再重新向系统申请写操作。那么这个FD_WRITE事件在底层不会被删除,底层也不会向上层再发一个新的FD_WRITE事件"
那之后我要发送数据要怎么办呢?
直接send吗?这样的话,如何得知SOCKET是否可写?而且这样做,FD_WRITE事件就好像变得没什么意义了
#7
当然直接send
使用select判断,也是返回FD_WRITE,因为没有被删除,所以当然这个事件可用
FD_WRITE是说明可以发送数据,至于意义,要看怎么使用了
使用select判断,也是返回FD_WRITE,因为没有被删除,所以当然这个事件可用
FD_WRITE是说明可以发送数据,至于意义,要看怎么使用了
#8
也就是说要发送数据时不用现会FD_WRITE事件是否被激发,而是用select看是否可写,可写就直接用send.是这样吗?
那事件选择模型里的FD_WRITE事件还是没什么用哦
那事件选择模型里的FD_WRITE事件还是没什么用哦
#9
我也觉得FD_WRITE事件没什么意义.
据我的理解select模型中FD_WRITE事件只果检查可写性!
据我的理解select模型中FD_WRITE事件只果检查可写性!
#10
罗的那本WINASM有讲:
当缓冲区满的时候发不了东西,一旦缓冲区空出了一点 系统就发个FD_WRITE消息提示可以发数据了 如果满的时候还调用send是发不出去的
当缓冲区满的时候发不了东西,一旦缓冲区空出了一点 系统就发个FD_WRITE消息提示可以发数据了 如果满的时候还调用send是发不出去的
#11
总结下吧:有二个地方,会发生此事件
1.第一个连接成功,状态会有一个FD_WRITE事件
2.当send()发送太快,缓冲被满后如缓冲再次可用,状态会有一个FD_WRITE事件。
当有FD_WRITE事件被设置后,如用户调用send(),或检查此状态的函数(如select()等API),将清除此状态值。
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.当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事件
如果在这个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事件就好像变得没什么意义了
如果在连接完成后,程序不需要立即发送数据.按照你的说法:
"如果在这个FD_WRITE事件事件之后,没有投递send再重新向系统申请写操作。那么这个FD_WRITE事件在底层不会被删除,底层也不会向上层再发一个新的FD_WRITE事件"
那之后我要发送数据要怎么办呢?
直接send吗?这样的话,如何得知SOCKET是否可写?而且这样做,FD_WRITE事件就好像变得没什么意义了
#7
当然直接send
使用select判断,也是返回FD_WRITE,因为没有被删除,所以当然这个事件可用
FD_WRITE是说明可以发送数据,至于意义,要看怎么使用了
使用select判断,也是返回FD_WRITE,因为没有被删除,所以当然这个事件可用
FD_WRITE是说明可以发送数据,至于意义,要看怎么使用了
#8
也就是说要发送数据时不用现会FD_WRITE事件是否被激发,而是用select看是否可写,可写就直接用send.是这样吗?
那事件选择模型里的FD_WRITE事件还是没什么用哦
那事件选择模型里的FD_WRITE事件还是没什么用哦
#9
我也觉得FD_WRITE事件没什么意义.
据我的理解select模型中FD_WRITE事件只果检查可写性!
据我的理解select模型中FD_WRITE事件只果检查可写性!
#10
罗的那本WINASM有讲:
当缓冲区满的时候发不了东西,一旦缓冲区空出了一点 系统就发个FD_WRITE消息提示可以发数据了 如果满的时候还调用send是发不出去的
当缓冲区满的时候发不了东西,一旦缓冲区空出了一点 系统就发个FD_WRITE消息提示可以发数据了 如果满的时候还调用send是发不出去的
#11
总结下吧:有二个地方,会发生此事件
1.第一个连接成功,状态会有一个FD_WRITE事件
2.当send()发送太快,缓冲被满后如缓冲再次可用,状态会有一个FD_WRITE事件。
当有FD_WRITE事件被设置后,如用户调用send(),或检查此状态的函数(如select()等API),将清除此状态值。
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.当connect()连接到远程时,会出现个FD_WRITE的事件
2.当系统缓冲区有空间,还可以处理更多数据(向外发送的数据)时,就会产生这个事件.一般就是发送数据,系统返回缓冲区已满的信息,然后等一会,缓冲区有空间可以处理更多数据时,这个事件就会被激发.