异步Socket的Shutdown问题 ( 积分: 100 )

  • 主题发起人 主题发起人 iamrich
  • 开始时间 开始时间
I

iamrich

Unregistered / Unconfirmed
GUEST, unregistred user!
我用iocp做了一个客户端,连接服务器的时候上传文件,当上传完成时候用
shutdown(mSocket,1) 报错,错误代码10057

实际上这个 socket 根本没有关闭,还是在连接状态中的

如果是同步socket就是正常的。。为什么用 overlapped就会这样呢?

我的流程如下

1. connectEx...
2. 在线程中得到 connect 成功的消息
3. 然后WSASend, 一个16k的buffer, 给服务器
4. 在线程中得到 WSASend的完成通知,这个时候我 shutdown(msocket), 就得到了10057错误

因为 shutdown之后还要调用closesocket, 这样就导致了不是优雅的关闭,从而服务器没有正确收到数据,如果在WSASend的完成通知后用DisconnectEx,一切顺利,可是 W2000不支持 DisconnectEx啊
 
看不出有什么问题. 还有, 开头说是IOCP, 后面说是overlapped???

关注下
 
10057的错误是没有连接就进行了传输的操作,MSDN描述如下
WSAENOTCONN (10057)
Translation: Socket is not connected.
Description: A request to send or receive data is not permitted because the socket is not connected and (when sending on a datagram socket using sendto [Wsapiref_4sqa.asp], no address was supplied). Any other type of operation may also return this error, for example, setsockopt (Wsapiref_94aa.asp) setting SO_KEEPALIVE if the connection has been reset.

说明你的程序在关闭连接之后依然存在着读写的操作,MSDN也提醒说Shutdown对于底层的协议不起作用,为了确保“优雅”的关闭,MSDN给出了下列步骤:

1. Call WSAAsyncSelect to register for FD_CLOSE notification.
2. Call shutdown with how=SD_SEND.
3. When FD_CLOSE received, call recv until zero returned, or SOCKET_ERROR.
4. Call closesocket.

你这样试试
另外你的IOCP代码能否发给我一份,我们互相学习一下
muhx1981@126.com
 
客户端似乎没必要用iocp
 
to muhx,
我的程序在关闭连接之后是没有读写操作的

iocp模式下,还需要用 AsyncSelect 吗?

而且现在我面临的问题,是 shutdown 这一步就出错误,没有到 closesocket 呢
 
客户端用消息SOCKET足够了[:D]
 
客户端不必用IOCP了,简单的Sokcet模型就行了。
 
to 张无忌和jfyes, 我提问的是关于iocp关闭socket的问题,而不是客户端是否使用iocp的问题

或者这样想,我用 iocp 做了一个服务器,是FTP Server, 那么在PORT(Active) 模式的时候是主动连接客户端的,那也符合我描述的问题。
 
后退
顶部