经过测试.Winsock在局网状态下会掉包!
接收端代码如下(一个Winsock控件):
Option ExplicitPrivate Sub Form_Load()
Winsock1.LocalPort = 9550
Winsock1.Listen
End SubPrivate Sub Winsock1_Close()
Winsock1.Close
Winsock1.Listen
End SubPrivate Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
Winsock1.Close                '关闭监视
Winsock1.Accept requestID     '接受新连接ID
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)        '新数据到达
Print bytesTotal
End Sub
发送端代码如下(一个Winsock控件,一个按钮做连接用):
Private Sub Command1_Click()
Winsock1.Connect
End SubPrivate Sub Winsock1_Connect()
Dim x As String
Dim y As Integer
For y = 1 To 4800
    x = x & "1"
Next y
Winsock1.SendData x
End Sub经过测试,这段代码没问题..但是发送过程有问题.如果哪个大哥有空帮忙小弟请留下QQ!

解决方案 »

  1.   

    方法不对关WINSOCK啥事.我还以为你发现了微软的啥BUG呢.
      

  2.   

    标准TCP协议不存在丢包一说...........
      

  3.   

    那不是winsock的掉包是你vb程序的问题主要还是因为vb是多线程的能力问题我估计是当winsock发包的时候你的vb在干别的事
      

  4.   

    为什么不能?你这个建立的是无连接方式的数据发送你用tcp模式listen方式你再看,如果丢包了你再来说winsock会丢包winsock是不会丢包的 原因上面他们都说了
      

  5.   

    winsock缺省值就是TCP协议,控件属性里面,所以还用怎么设置吗?
      

  6.   

    你这个winscok算稳定的listen模式么?你不要每回都close你再发送多个包看看
      

  7.   

    我哪有每次都CLOSE啊?这个掉包是偶尔的.不是绝对的.发送10次会有三次掉.不是全部掉完.是会少接收!
      

  8.   

    udp会 tcp不会,不让有链接和无链接就没有多大意思了
      

  9.   

    不知道LZ的以下代码中为何要Winsock1.Close
    Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long) 
    Winsock1.Close                '关闭监视      
    Winsock1.Accept requestID    '接受新连接ID 
    End Sub 
      

  10.   

    你试一下就知道了....
    如果不先设置winsock空闲状态就会出错...
      

  11.   

    请参阅:http://topic.csdn.net/u/20090605/02/29095de0-92db-4ef4-9590-6e777a0fcaef.html
    建议LZ凡遇到问题须多动脑筋,仔细查找自己代码的BUG.
      

  12.   

    我的代码如下:
    接收(一个WINSOCK):Option ExplicitPrivate Sub Form_Load()
    Winsock1.LocalPort = 9550
    Winsock1.Listen
    End SubPrivate Sub Winsock1_Close()
    Winsock1.Close
    Winsock1.Listen
    End SubPrivate Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
    Winsock1.Close                '关闭监视
    Winsock1.Accept requestID     '接受新连接ID
    End Sub
    Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)        '新数据到达
    Dim x As String
    Print bytesTotal
    Winsock1.GetData x
    End Sub发送(一个WINSOCK 两个按钮):Option ExplicitDim x  As String, y As IntegerPrivate Sub Command1_Click()
    Winsock1.Connect
    End SubPrivate Sub Command2_Click()
    Winsock1.SendData x
    End SubPrivate Sub Form_Load()
    For y = 1 To 4800
        x = x & "0"
    Next y
    Winsock1.RemoteHost = "192.168.1.200"
    Winsock1.RemotePort = 9550
    End Sub
    -------------------------------------------------------------------
    这样都不行吗?
      

  13.   

    For y = 1 To 4800 
        x = x & "1" 
    Next y 
    Winsock1.SendData x x老长老长,肯定对出问题的,就像QQ传输一个2G以上的文件就会被禁止的
      

  14.   

    TCP是不会掉包的, 正常情况下winsock是一次发送8k数据, 大于部分会自动分包发送, 所以关键是你要构造好你的数据包,通常的结构是:包头+数据+结尾,接收端要有判断是不是数据完整接收了...也就是有没有收到结尾标志, 然后再输出结果...