none
C# SOCKET 异步问题 RRS feed

  • 问题

  • 用异步模式创建了socket服务器和客户端,服务器监听来自多个客户端的连接请求,有连接就开始BeginReceive()。
    1.如果所有数据都读完了,一切正常,服务器是否还是一直保持BeginReceive()?如果要一直监听是不是就要一直保持BeginReceive()?
    2.如果要正常断开,不管是从服务器还是从客户端断开,应该如何做?
      网上资料大都用socket.shutdown(),然后socket.close()。可我用shutdown()总出异常,好像是无连接socket不能shutdown.好,那我直接close(),客户端就会丢异常出来了,“远程主机强迫关闭了一个连接”,虽说被断开方可以捕获异常,但是这么“粗暴”的断开总不太好吧,而且我怀疑一些非托管资源没释放,比如说端口。
      另外还有个socket.BeginDisconnect()方法,看意思也是断开连接的,这个和close()有何区别,在什么情况下用?
       我用了这个socket.BeginDisconnect()后客户端就狂收空的数据(现象就是显示接受数据的文本框的滚动条快速向下滚动,肯定是不停的收数据在,但是什么也看不到)
    3.客户端new了一个socket对象后,BeginConnect()连接到服务器,服务器检测到的远程主机是客户端的ip+一个随机端口,这个端口如何指定一个???


    c#socket异步方面国内有没有比较好的的资料?感觉总是有些地方没贯通的感觉。希望各位专家们指点下迷津,拯救下迷途的羔羊吧。
    2009年6月24日 2:00

答案

  • 1  。。。我看错了 udp阿。。。的确是这样的。

    2 粗暴的断开不太好  这个时候你可以仔细看看  beginreceive 和endreceive   他们中间有一个是参数化的返回连接状态和错误代码的  而不是throw exception   这样就不粗暴了
    以下为vb代码

                   Dim e As Net.Sockets.SocketError
                    length = _Socket.EndReceive(o, e)
                    If e <> Net.Sockets.SocketError.Success Then
                        Me.Close()
                        Exit Sub
                    End If

    按照我的理解 socket.BeginDisconnect() 一般是发送一个要断开的flag包  通知客户端要关闭连接。   这个时候客户端发现受到一个0长度的包  就应该主动close了。 客户端没有反应   服务端就会一直重新发吧。   如果服务器端发现客户端主动断开了   才会进行到 enddisconnect.

    3 这个还真不知道  你说的udp协议?  貌似客户端端口都是随机可用的
    紫柔版主的头像真叫萌得一个不行啊。。。。
    答案800 撒花
    2009年6月24日 2:54
    版主

全部回复

  • 1  。。。我看错了 udp阿。。。的确是这样的。

    2 粗暴的断开不太好  这个时候你可以仔细看看  beginreceive 和endreceive   他们中间有一个是参数化的返回连接状态和错误代码的  而不是throw exception   这样就不粗暴了
    以下为vb代码

                   Dim e As Net.Sockets.SocketError
                    length = _Socket.EndReceive(o, e)
                    If e <> Net.Sockets.SocketError.Success Then
                        Me.Close()
                        Exit Sub
                    End If

    按照我的理解 socket.BeginDisconnect() 一般是发送一个要断开的flag包  通知客户端要关闭连接。   这个时候客户端发现受到一个0长度的包  就应该主动close了。 客户端没有反应   服务端就会一直重新发吧。   如果服务器端发现客户端主动断开了   才会进行到 enddisconnect.

    3 这个还真不知道  你说的udp协议?  貌似客户端端口都是随机可用的
    紫柔版主的头像真叫萌得一个不行啊。。。。
    答案800 撒花
    2009年6月24日 2:54
    版主
  • 2.大概知道怎么搞了,可以返回连接状态和错误代码来断开.也可以看EedReceive的返回字节数,为0就主动close了。不过我用的确实是TCP,好像创建的socket无连接只是监听的话shutdown就会出异常。这点还是没理解。要主动断开的话用BeginDisconnect()似乎更好,不过服务器和客户端2边都要处理。

    3.已解决,客户端随机端口就让他随机去。不过也可以绑定一个固定的。

    1.我用的TCP。。。

    再附加个问题^-^:

    4.服务器定期向所有连接客户端发数据,怎么办比较好?
    2009年6月25日 3:11
  • 定期主动发送 不如让endreceive() 的线程取得


    紫柔版主的头像真叫萌得一个不行啊。。。。
    答案800 撒花
    2009年6月25日 4:43
    版主