如何处理WINSOCK数据丢包的问题

lyqof908 2002-11-13 05:19:30
我发现我发的数据,在服务器有的没有收到。

在算法上应该怎样知道有的数据包丢失了,没收到?

(因为改版了,最多是100分,如果解决问题,1000分都可以。)
...全文
271 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuanxy 2002-11-20
  • 打赏
  • 举报
回复
楼上这位大哥您的查屏是怎么做的,是把picture控件存成bmp然后发送吗?您知道怎么用getdibits函数吗?
lyqof908 2002-11-19
  • 打赏
  • 举报
回复
heng_s(渣渣) :
8K这个最大额,我已经实验出来。
如果按你的第3个方法,是不会出错,不会丢包,但是实际的代码如何编写?因为SendData是由窗口上的按钮触发的,如果用户点了很多次发送按钮,你几次的数据是如何分开发送。

注:
我已经使用WINSOCK快一年了,完成了聊天,查屏,数据传送,文件传送的功能了。
oo渣渣oo 2002-11-19
  • 打赏
  • 举报
回复
1.用WinSock一次最多只能发送8K的数据,再多的话,WinSock会自动分成几次发;
2.用WinSock发送数据,每次发送的数据量越大,丢包率越高.我测试过,一次发4K的数据丢包率已经很高了;
3.如果你追求的是数据的完整性(绝不允许丢包),那么,建议你每次最多只发送1024字节的数据,收到对端响应后再发送下一个1024,直到发完为止.
4.在SendData方法之后再加上一句DoEvents,保证每次的数据都单独发送.
lyqof908 2002-11-18
  • 打赏
  • 举报
回复
我今天又写了个简单的程序来测试。
我把服务器的网络断开了,客户端还有发送成功的事件,然后错误事件半天才出来。
而且我在网络断了以后,客户端发了4次消息,错误事件出了三次。
以下是我的代码的返回消息:

Connet:192.168.0.34
WS_Connect
WS_SendProgress:bytesSent3 bytesRemaining:0
WS_SendComplete
WS_SendProgress:bytesSent3 bytesRemaining:0
WS_SendComplete
WS_SendProgress:bytesSent3 bytesRemaining:0
WS_SendComplete
--------------NET CARD NOT CONNECT

WS_SendProgress:bytesSent3 bytesRemaining:0
WS_SendComplete
WS_SendProgress:bytesSent3 bytesRemaining:0
WS_SendComplete
WS_SendProgress:bytesSent3 bytesRemaining:0
WS_SendComplete
WS_Error:由于超时或其它失败,连接中止
--------------------------------------
以下是我的客户程序的源代码,服务器的代码也差不多。
Option Explicit

Private Sub cmdConnect_Click()
Add "Connet:" & txtIP
WS.Close
WS.RemoteHost = txtIP.Text
WS.RemotePort = 999
WS.Connect
End Sub


Private Sub Add(strTxt As String)
strTxt = Replace(strTxt, vbCrLf, " ")
With txtView
.Text = .Text & vbCrLf & strTxt
End With
End Sub

Private Sub cmdSend_Click()
' WS.SendData txtData
WS.SendData txtData
End Sub

Private Sub Form_Unload(Cancel As Integer)
WS.Close
End Sub

Private Sub WS_Close()
Add "WS_Close"
End Sub

Private Sub WS_Connect()
Add "WS_Connect"
End Sub

Private Sub WS_ConnectionRequest(ByVal requestID As Long)
Add "WS_ConnectionRequest"
End Sub

Private Sub WS_DataArrival(ByVal bytesTotal As Long)
Dim strData As String

WS.GetData (strData)
Add "WS_DataArrival:" & strData
End Sub

Private Sub WS_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
Add "WS_Error:" & Description
End Sub

Private Sub WS_SendComplete()
Add "WS_SendComplete"
End Sub

Private Sub WS_SendProgress(ByVal bytesSent As Long, ByVal bytesRemaining As Long)
Add "WS_SendProgress:bytesSent" & bytesSent & " bytesRemaining:" & bytesRemaining
End Sub

violet_lc 2002-11-16
  • 打赏
  • 举报
回复
不会丢包啊,你用的是TCP传输,在整个传输过程中tcp怎么会丢包呢?肯定是你在发送和接收的数据包的数据格式不同。
lyqof908 2002-11-16
  • 打赏
  • 举报
回复
TCP真的是不丢包吗?
我听说VB在使用WINSOCK深一点的时候,就会发现它有无法解决的BUG

就算TCP不丢包,我发送的每一笔数据,在SendComplete事件之前它都是未传到对方的吧。

然后在数据未传到之前,我如何保存这笔数据。
=====================================================
反正我的意思就是要个可靠的WINSOCK网络传输解决方案。
bluecc 2002-11-14
  • 打赏
  • 举报
回复
一般TCP传数据不会丢包,我在CDPD无线网络上试过,由于是无线网络,传输数据不是很可靠,用UDP传会丢包,用TCP则没有,因此我觉得TCP一般不会丢包.
至于你丢包,一你可以检查一下程序,二可以加点校验,简单的就是把你收到的再发回去,以检查是否是原来发出去的,复杂一点的当然可以用校验码,你可以查一查资料
nydelphi 2002-11-14
  • 打赏
  • 举报
回复
up
edwardpro 2002-11-14
  • 打赏
  • 举报
回复
TCP是有连接的协议,网络正常情况下不可能丢包。最好把更详细的情况贴上来。
lyqof908 2002-11-14
  • 打赏
  • 举报
回复
我是使用TCP的
yas 2002-11-14
  • 打赏
  • 举报
回复
如果条件允许,尽量使用TCP,少用UDP
lyqof908 2002-11-14
  • 打赏
  • 举报
回复
我是用的WINSOCK控件。

WINSOCK控件是不是不可靠?
也就是使用SendData方法发送出的数据。服务器端不一定收得到是吗?
litsnake1 2002-11-13
  • 打赏
  • 举报
回复
那有没有进行丢包的后的处理?
我想问一下,你用得是winsock控件

1,502

社区成员

发帖
与我相关
我的任务
社区描述
VB 网络编程
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧