客户端向服务器端发送connect请求,而如果服务器端对connectionRequest事件不予响应,即在这个事件过程中没有任何代码,会是一种什么情况呢?
从我写的程序中看是客户端认为连接成功并发送了信息。请问是这样的吗?
另外,客户端发送connect请求,服务器端如果要响应,则先要对相应winsock控件执行close方法,然后使用Accept方法连接,那么使用什么方法表示不接受呢?是不是仅仅采用close方法就表示不接受呢?

解决方案 »

  1.   

    没有Accpet的话应该是不算连接成功的。
    应该算是状态6,连接中。如果是同一个winsock accept的话当然要close先啦~因为监听中的socket不能使用accept.
    如果不接受就别管这个requestID好了,客户端超时自己判断
    或者拿一个新的winsock accpet了再close,那客户端就不用等超时。
      

  2.   

    仁兄的回复让我想起一个办法,就是做简单的一个服务器端和一个客户端试试,这一试,发现客户端发送connect请求时,无论服务器端对connectionRequest事件是否Accept,都会让客户端产生connect事件,只有从state中查看连接情况了。
      

  3.   

    再继续测试,发现如果服务器端connectionRequest事件中如果有MsgBox这种能暂时停止程序运行的语句,则客户端认为连接上了,客户端winsock控件的state是7;而如果服务器端没有MsgBox语句,也没有Accept的话,则客户端会响应connect事件,但其winsock控件的state是8,为什么会这样,请高手释疑,谢谢。
      

  4.   

    只有Accept以后才是成功,如果这个事件中没写东西 当然是失败了
      

  5.   

    能吃的影子兄,你的意思就是客户端是肯定能响应connect事件了?
      

  6.   

    客户端在连接成功以后才会响应connect事件 ,不成功不会响应的我不知道你要做什么,或者是不知道各个时间的时间,或者是不知道特定的过程怎么处理,你可以直接说你遇到的问题
      

  7.   

    能吃的影子兄,我现在碰到的问题就是对winsock控件一头雾水。所以想理清思路,首先碰到的问题就是,客户端响应connect事件是什么时候——是不是服务器端Accept后呢?如果不是,但在我测试中,服务器端即便不Accept,客户端也响应connect事件,并且客户端的state为7;如果是,那么客户端怎么判断可以开始向服务器端发信息了?谢谢
      

  8.   

    在一般的应用中,服务器的connect事件必须写好了accept才能保证客户端可以连接服务器客户端在连接完服务器成功了以后才触发客户端的事件
    给你个服务器的例子看看吧
    Option Explicit
    Private intMax As Long 'winsock最大的下标Private Sub Form_Load()
        intMax = 0
        Winsock1(0).LocalPort = 7699 '本地监听的端口
        Winsock1(0).ListenEnd Sub
    '*************************************************************************
    '**函 数 名:Winsock1_ConnectionRequest
    '**输    入:Index(Integer)        -
    '**        :ByVal requestID(Long) -
    '**输    出:无
    '**功能描述:对方请求连接时候触发,当没有以前已经关闭的控件的winsock控件数组的话就创建
    '**全局变量:
    '**调用模块:
    '**作    者:影子
    '**日    期:2005-02-06 08:39:12
    '**修 改 人:
    '**日    期:
    '**版    本:V1.0.0
    '*************************************************************************
    Private Sub Winsock1_ConnectionRequest(Index As Integer, ByVal requestID As Long)    If Index = 0 Then
            Dim i As Integer
            Dim temp As Integer
            temp = 0
            For i = 1 To intMax
                If Winsock1(i).State = 0 Then
                    temp = i
                    Exit For
                End If
            Next
            If temp = 0 Then
                intMax = intMax + 1
                temp = intMax
            End If
            Load Winsock1(temp)        Winsock1(temp).LocalPort = 0        Winsock1(temp).Accept requestID
        End IfEnd Sub
      

  9.   

    客户端Connect 以后有2种处理方法1.用doevents的循环延时,然后判断winsock的状态 ,为7表示连接成功2。触发Connect事件
    这里你可以sendate一下,如果出错了也是连接失败至于你说的问题我没有遇到
      

  10.   

    请能吃的影子兄看我写的测试代码:
    ===== 服务器端 ======
    Private Sub Form_Load()
        Winsock1.LocalPort = "1888"
        Winsock1.Listen
    End SubPrivate Sub Form_Unload(Cancel As Integer)
        Winsock1.Close
    End SubPrivate Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
        MsgBox (Winsock1.RemoteHostIP)
        Winsock1.Close
    End Sub====== 客户端 ======Private Sub Command1_Click()
        If Winsock1.State <> 0 Then
            Winsock1.Close
        End If
        MsgBox (Winsock1.State)
        Winsock1.RemoteHost = "127.0.0.1"
        Winsock1.RemotePort = "1888"
        Winsock1.Connect
    End SubPrivate Sub Winsock1_Connect()
        MsgBox ("已经连接上了")
        MsgBox (Winsock1.State)
        Winsock1.SendData "测试连接信息"
    End SubPrivate Sub Winsock1_SendComplete()
        MsgBox ("测试信息已经发送完毕")
    End Sub
    ====================================
    除以上代码再没有别的代码了,以上代码分别生成两个程序,点击客户端的Command1按钮时,先后弹出四个信息,内容为:
    0
    已经连接上
    7
    测试信息已经发送完毕请兄斧正。
      

  11.   

    '请能吃的影子兄看我写的测试代码:
    '===== 服务器端 ======
    Private Sub Form_Load()
        Winsock1.LocalPort = "1888"
        Winsock1.Listen
    End SubPrivate Sub Form_Unload(Cancel As Integer)
        Winsock1.Close
    End SubPrivate Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
     
        Winsock2.Close
        Winsock2.Accept requestID
    End Sub'====== 客户端 ======Private Sub Command1_Click()
        If Winsock1.State <> 0 Then
            Winsock1.Close
        End If
        MsgBox (Winsock1.State)
        Winsock1.RemoteHost = "127.0.0.1"
        Winsock1.RemotePort = "1888"
        Winsock1.Connect
    End SubPrivate Sub Winsock1_Connect()
        MsgBox ("已经连接上了")
        MsgBox (Winsock1.State)
        Winsock1.SendData "测试连接信息"
    End SubPrivate Sub Winsock1_SendComplete()
        MsgBox ("测试信息已经发送完毕")
    End Sub
    '====================================
    '除以上代码再没有别的代码了,以上代码分别生成两个程序,点击客户端的Command1按钮时,先后弹出四个信息,内容为:
    0
    已经连接上
    7
    测试信息已经发送完毕请兄斧正?
      

  12.   

    Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
     
        Winsock2.Close
        Winsock2.Accept requestID
    End Sub
    你正常写法不会出错的,你非要错误的来,建议你去搞测试
      

  13.   

    不好意思,我想了解的就是这个地方:
    Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
    End Sub
    为什么中间在没有Accept语句的情况下,加上语句:MsgBox(Winsock1.RemoteHostIP),客户端的connect事件就被激活了,state为7?
      

  14.   

    我不知道微软怎么处理的,恐怕是这里面有事件就返回成功把
    你把MsgBox(Winsock1.RemoteHostIP) 换成 text1.text="sdfsadfa"看看是不是一样成功
      

  15.   

    现在更奇怪了,服务器端连ConnectionRequest事件的代码我都去掉了,但客户端发送connect请求后,仍然显示state为7,并且发送数据成功:(