用SOkET传送文件的问题请教————在线等待中!(100分)

  • 主题发起人 主题发起人 dfs
  • 开始时间 开始时间
to sofox:
FD_WRITE事件是在FD_CONNECT发生以后的第二个事件,以后就说明这个套接字可以
写入数据了,你没有收到数据如何分析数据向对方发送数据了?而且FD_WRITE事件
不是系统一直在发的,当然问题是可以解决的,
 
to 无忌:
非也, FD_WRITE是WSAAsyncSelect后的Socket在发送缓冲区有空间可用时通过message发送
给应用程序的,系统会在下列几种情况时通知我们 FD_WRITE 事件:

(1)呼叫 WSAAsyncSelect() 来设定 FD_WRITE 事件时,Socket 已经可以
传送资料(TCP scoket 已经和对方连接成功了,或 UDP socket 已建立完成),
且目前 output buffer 仍有空间可写入资料。
(2)呼叫 WSAAsyncSelect() 来设定 FD_WRITE 事件时,Socket 尚不能传
送资料,不过一旦 Socket 与对方连接成功,马上就会收到 FD_WRITE 的通
知。 (这就是你说的第二个事件吧)
(3)呼叫 send() 或 sendto() 传送资料时,系统告知错误,且错误码为
10035 WSAEWOULDBLOCK (呼叫 WSAGetLastError() 得知这项错误),这
时表示 output buffer 已经满了,无法再写入任何资料(此时即令呼叫再多次的
send() 也都一定失败);一旦系统将部份资料成功送抵对方,空出 output buffer
後,便会送一个 FD_WRITE 给使用者,告知可继续传送资料了。换句话说,读
者在呼叫 send() 传送资料时,只要不是返回错误 10035 的话,便可一直继续呼
叫 send() 来传送资料;一旦 send() 回返错误 10035,那麽便不要再呼叫 send()
传送资料,而须等收到 FD_WRITE 後,再继续传送资料。
 
你说的我都知道,如果对方机器突然掉点,你就永远收不到哪个FD_WRITE消息,那么打开的
文件句柄就关不掉了,这么就有资源泄露....
我几乎用不用FD_WRITE消息,我在收到10035错误以后直接sleep()一会,再次发送数据
设置一个出现这个错误的重复次数,如果超过了这个次数,我就关闭套接字退出,
这个可以避免客户机器的CLIENT应用程序死掉,还可以避免对方机器重起,效果更好!
 
听课,学习
 
一问一答方式简单的多!
 
后退
顶部