在一个窗体上最多可以有几个winsock控件,我编了一个程序,一个窗体上有两个winsock控件,一个用于接收,一个用于发送,但是在发送信息时,能和别人连接上,信息发送不出去?请问这是怎么回事?我想让发送部分自动执行!
这是我的代码,大家帮帮我看一下,在这先谢谢了!
Option Explicit
Dim i As Integer
Dim A() As String
Dim sql As String
Dim rs_deal As New ADODB.Recordset
Dim sql1 As String
Dim B() As String
Dim t1 As Integer
Dim t2 As Integer
Dim rs_fs As New ADODB.Recordset
Dim m As String
Private Sub form_load()
   Text2(0).Text = Format(Date, "yyyy-mm-dd")
   Winsock1.Protocol = sckTCPProtocol
   Winsock1.LocalPort = 3333
   Winsock1.Listen
End Sub
Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
   If Winsock1.State <> sckClosed Then
         Winsock1.Close
         Winsock1.Accept requestID
   End If
End Sub
Private Sub Winsock1_dataarrival(ByVal bytestotal As Long)
   On Error Resume Next
   Dim clientdata As Variant
   Winsock1.GetData clientdata, vbString
   inf = clientdata
End Sub
Private Sub Winsock1_close()
   Winsock1.Close
   If inf = "" Then
      Winsock1.Listen
   Else
      inf_save
      inf_fs
   End If
End Sub
Private Sub inf_save()
   Adodc1.connectionstring = "provider =microsoft.jet.oledb.4.0;data source=bus.mdb;jet oledb:database password ='123'"
   Adodc1.RecordSource = "select * from 运行信息"
   Adodc1.Refresh
   Adodc1.Recordset.AddNew
   Text2(0).Text = Format(Date, "yyyy-mm-dd")
   A = Split(inf, "/")
   For i = 1 To 8
       Text2(i).Text = A(i - 1)
   Next i
   sql = "select 站牌名 from 站牌信息 where 所属路线 = '" & A(0) & "' and 站牌编号= '" & A(7) & "'"
   rs_deal.Open sql, conn, adOpenKeyset, adLockPessimistic
   Text2(9).Text = rs_deal.Fields(0)
   station = Text2(9).Text
   rs_deal.Close
   Adodc1.Recordset.Update
   For i = 1 To 9
       Text2(i).Text = ""
   Next i
End Sub
Private Sub inf_fs()
   B = Split(inf, "/")
   If B(7) < 200 Then
       sql1 = "select 站牌编号,IP,端口 from 站牌信息 where 站牌编号>= '" & B(7) & "' and 站牌编号 < '104' and 所属路线 = '" & B(0) & "'order by 站牌编号"
       rs_fs.Open sql1, conn, adOpenKeyset, adLockPessimistic
   Else
       sql1 = "select 站牌编号,IP,端口 from 站牌信息 where 站牌编号>= '" & B(7) & "' and 站牌编号 <='300'  and 所属路线 = '" & B(0) & "'order by 站牌编号"
       rs_fs.Open sql1, conn, adOpenKeyset, adLockPessimistic
   End If
   Do While Not rs_fs.EOF
      t1 = rs_fs.Fields(0) - B(7)
      t2 = 5 * t1
      m = B(0) & "" & t2 & "" & B(5) & "" & station
      Winsock2.Protocol = sckTCPProtocol
      Winsock2.RemoteHost = rs_fs.Fields(1)
      Winsock2.RemotePort = CLng(rs_fs.Fields(2))
      Winsock2.Connect
      Do While Not Winsock2.State = sckConnected
         DoEvents
      Loop
      Winsock2.SendData m
      Winsock2.Close
      m = ""
      rs_fs.MoveNext
   Loop
   rs_fs.Close
   Winsock1.Listen
End Sub

解决方案 »

  1.   

    先要说明.
    一个WinSock与另一个程序的Winsock连接上后是一对一的关系,
    也就是说,互相之间又可以发送,又可以接收.
    如果你想一个程序用二个Winsock与另一个程序一个Winsock相连
    一个接收,一个用于发送,那是行不通的.
      

  2.   

    可能是你理解错了,我那个信息是发送到其他程序中,与前一个的winsock没有关系?
    这样的话,上述问题请问怎么解决?
      

  3.   

    Winsock2.Protocol = sckTCPProtocol 
          Winsock2.RemoteHost = rs_fs.Fields(1) 
          Winsock2.RemotePort = CLng(rs_fs.Fields(2)) 
          Winsock2.Connect 
          Do While Not Winsock2.State = sckConnected 
            DoEvents 
          Loop 
          Winsock2.SendData m 
          Winsock2.Close 
    这一段直接用
    winsock1.senddata m
    也不要关闭了.当你不想连接的时候就选择关闭就行了.
      

  4.   

    我这个程序的功能是接收别的服务器发来的信息,然后经处理发送给其他服务器,要求,不管从接收到发送希望全自动执行,并且不止发送给一个服务器,现在最大的问题就是能和别的服务端能连接上,就是把信息发送不出去。
     Winsock2.SendData m 
    就是这句,在调试中已经执行,但是没把信息发出去!
      

  5.   


    '那你就不能用
    'Winsock1.Listen 
    '以下告诉你思路,代码段,我就不贴子.
    '正如你所说要用二个Winsock(接收一个Winsock,发送给几个服务器就要用几个Winsock)
    '比如你接收一个,要发送至三个不同的服务器,那就要四个winsock
    'winsock的分配:
    'winsockGetData  接收的Winsock名称
    'WinSockSendData 发送的 Winsock名称 设置 Index=0'程序开始:
    '初始化for i=1 count(要发送的服务器总数)
     load winsockSendData(i)
    nextwinsockGetData.Connect 远程服务器地址,远程服务器端口  '此处的是接收服务器的数据for i=1 count(要发送的服务器总数)
      winsockSendtData(i).Connect 远程服务器地址(i),远程服务器端口(i)  '此处的是每个发送服务器的数据
    nextPrivate Sub WinsockGetData_DataArrival(ByVal bytesTotal As Long)   '此处在接收服务器的接收事件中
      dim StrData as string
      winsockGetData.GetData StrData
      winsockSendData(标志).StrData '此处通过接收到的数据的标志判断发送至那一个服务器(标志是判断是发送那一台服务器的下标)
    End Sub
      

  6.   


    '初始化
    Dim SendDataCount(100) As Boolean  '设置可以接收100个客户端的数据
    WinsockSendData.LocalPort = 4000          '本地监听端口
    WinsockSendData.Listen                    '监听winsockGetData.Connect 远程服务器地址,远程服务器端口  '此处的是接收服务器的数据Private Sub WinsockGetData_DataArrival(ByVal bytesTotal As Long)   '此处在接收服务器的接收事件中
      dim StrData as string
      winsockGetData.GetData StrData
      winsockSendData(标志).StrData '此处通过接收到的数据的标志判断发送至那一个服务器(标志是判断是发送那一台服务器的下标)   '分析.返回数据. 
       '当接收到的数据是接收方发来的返回成功标志
        'WinsockSendData(0).Close '关闭
        'WinsockSendData(0).Listen '接着进行监听
    End Sub
    Private Sub WinsockSendData_DataArrival(Index As Integer, ByVal bytesTotal As Long)
      If Index = 0 Then
         Load WinsockSendData(新的下标)     '如果有客户端连接,加载一个Winsock
         WinsockSendData(新的下标).LocalPort = 新的端口     
          WinsockSendData(新的下标).Listen
         WinsockSendData(Index).Close
         WinsockSendData(Index).Accept requestID
         WinsockSendData(Index).SendData 新的端口     '将新的端口发过去,让他采用新的端口进行连接,同时要求接收的服务器再发送一个成功标志
       Else
         WinsockSendData(Index).Close
         WinsockSendData(Index).Accept requestID
       End If
       
    End Sub