socket 的异步处理如不再需要了,需不需要 CancelIO ??? ( 积分: 50 )

  • 主题发起人 主题发起人 QSmile
  • 开始时间 开始时间
Q

QSmile

Unregistered / Unconfirmed
GUEST, unregistred user!
socket 的异步处理如不再需要了,需不需要 CancelIO ????

比如我对一个 socket 用 WSARecv 异步方式来读

然后用 WSAWaitForSingleObject 来等一个超时,如果超时了,那我就不再等待,认为该操作无效。这时我需不需要用 CancelIO 来取消在句柄上的IO操作呢?


但 WinSocket API 里没有 WSACancelIO 之类的。CancelIO 是属于文件操作类的

只有一个 WSACancelAsyncRequest , 帮助上说,这个API 是用来取消 WSAAsyncGetXByY 这个请求的。

到底该不该用 CancelIO,或用哪个函数来取消IO操作?
 
closesocket就可以了
 
或者setsockopt设超时也可以
 
答非所问
 
晕,自己好好想想吧。
如果关闭发送请求的socket,异步自然会返回
如果设定发送或接收超时,如果超时异步同样会返回
 
如果关闭发送请求的socket,异步自然会返回
---------------
问题是显而易见的,我不想关闭 socket

如果设定发送或接收超时,如果超时异步同样会返回
----------------
我只想问有没有一个函数,取消在这个 socket 上的异步操作。
 
如果关闭发送请求的socket,异步自然会返回

-------------------
这个我知道,但 WSARecv 的定义如下
int WSARecv (
SOCKET s,
LPWSABUF lpBuffers,
DWORD dwBufferCount,
LPDWORD lpNumberOfBytesRecvd,
LPDWORD lpFlags,
LPWSAOVERLAPPED lpOverlapped,
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionROUTINE
);

它有很多指针参数,一般情况下是 I/O 操作完成后,由系统来设值的。但这时用户已经不再等了, closesocket 后,这时 这个异步操作才返回。系统会不会去读写那几个不可靠的指针参数呢??

据我所知的,在文件I/O,串口时,用 ReadFile 时,异步操作,如果不用 CancelIO. 那在 CloseFile 时IO操作会返回,这时系统会去写那几个指针的值。就会出错。

TCP时我也用了 WSAWaitFor 超时后,不 CancelIO,没发现什么问题,测试好多次了,但总有点提心吊胆的,生怕哪天会出事
 
接受答案了.
 
后退
顶部