Winsock,TCP通信接收方的疑问。

i ama 2005-10-17 09:21:12
用TCP通信,发送方在发送消息的时候消息间用分割符分开
比如发送方依次发送下面4条消息:
AAAAAA#
BBBBBB#
CCCCCC#
DDDDDD#
由于网络传输速度的问题,此时接收方有没有可能接收到这样两条消息:
AAAAAA#BBBBBB#CCC
CCC#DDDDDD#
即一次完整的发送“CCCCCC#”被截断了?
...全文
446 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
MFCBibe 2005-10-23
  • 打赏
  • 举报
回复
TCP 发送的是 stream,没有分割点。
UDP 发送的是 消息包,有分割点。

建议看看 windows网络编程技术 这本书,网络上有 PDF 下载的。
xxrl 2005-10-19
  • 打赏
  • 举报
回复
数据包头部包含数据包长度,解析长度,判断,错误则丢弃,发送重新请求指令
bm1408 2005-10-18
  • 打赏
  • 举报
回复
典型的粘包问题~~
hjunxu 2005-10-18
  • 打赏
  • 举报
回复
晕哦。
这类问题因该搞个faq格。
Caps77 2005-10-18
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=207387
alexpdl 2005-10-18
  • 打赏
  • 举报
回复
你需要在TCP数据包之前加上二个字节,来标识该包的长度,
接收端分析,再组成一个个完整的包,做法是,
把收到的数据包先放到一个大的缓冲区中,然后从每次先读包的长度的二字节,

再根据这个长度读后面的数据。
lifengice0706 2005-10-17
  • 打赏
  • 举报
回复
会有这种现象的,这是tcp的粘包,楼上说得带长度是个好办法!
worlftki 2005-10-17
  • 打赏
  • 举报
回复
这就是网络粘包的问题。如果要区分最好在每段数据之前发之前加上长度,收到之后再解析。
当然也可以收发之前都清空缓冲区。
property1 2005-10-17
  • 打赏
  • 举报
回复
gz
Jexhat 2005-10-17
  • 打赏
  • 举报
回复
可能哦
一、WinSock简介 Socket(套接字)最初是由加利福尼亚大学Berkeley(伯克利)分校为UNIX操作系统开发的网络通信接口,随着UNIX的广泛使用,Socket成为当前最流行的网络通信应用程序接口之一。20世纪90年代初,由Sun Microsystems,JSB,FTP software,Microdyne和Microsoft等几家公司共同定制了一套标准,即Windows Socket规范,简称WinSock。 VB编写网络程序主要有两种式:1.winsock控件 2.winsockAPI 二、WinSock控件的使用 1.WinSock控件的主要属性 LocalHostName属性 本地机器名 LocalIP属性 本地机器IP地址 LocalPort属性 本地机器通信程序的端口(0<端口<65536) RemoteHost属性 远程机器名 RemotePort属性 远程机器的通信程序端口 Protocol属性 通过Protocol属性可以设置WinSock控件连接远程计算机使用的协议。可选的协议是TCP和UDP对应的VB的常量分别是sckTCPProtocol和sckUDPProtocol,Winsock控件默认协议是TCP。注意:虽然可以在运行时设置协议,但必须在连接未建立或断开连接后。 SocketHandle属性 返回当前socket连接的句柄,这是只读属性。 RemoteHostIP属性 属性返回远程计算机的IP地址。在客户端,当使用了控件的Connect法后,远程计算机的IP地址就赋给了RemoteHostIP属性,而在服务器端,当ConnectRequest事件后,远程计算机(客户端)的IP地址就赋给了这个属性。如果使用的是UDP协议那么当DataArrival事件后,发送UDP报文的计算机的IP才赋给了这个属性。 ByteReceived属性 返回当前接收缓冲区中的字节数 State属性 返回WinSock控件当前的状态 常数 值 描述 sckClosed 0 缺省值,关闭。 SckOpen 1 打开。 SckListening 2 侦听 sckConnectionPending 3 连接挂起 sckResolvingHost 4 识别主机。 sckHostResolved 5 已识别主机 sckConnecting 6 正在连接。 sckConnected 7 已连接。 sckClosing 8 同级人员正在关闭连接。 sckError 9   错误 2.WinSock主要法 Listen法用于服务器程序,等待客户访问。格式:Winsock对象.listen Connect法 用于向远程主机发出连接请求。格式:Winsock对象.connect [远程主机IP,远程端口] Accept法 用于接受一个连接请求。格式:Winsock对象.accept Request ID Senddata法 用于发送数据。格式:Winsock对象.senddata 数据 Getdata法 用来取得接收到的数据。格式:Winsock对象.getdata 变量 [,数据类型 [,最大长度]] Close法 关闭当前连接。格式:Winsock对象.close Bind法 用Bind法可以把一个端口号固定为本控件使用,使得别的应用程序不能再使用这个端口。 Listen法Listen法只在使用TCP协议时有用。它将应用程序置于监听检测状态。 Connect法 当本地计算机希望和远程计算机建立连接时,就可以调用Connect法。Connect法调用的规范为:Connect RemoteHost,RemotePort Accept法 当服务器接收到客户端的连接请求后,服务器有权决定是否接受客户端的请求。 SendData法当连接建立后,要发送数据就可以调用SendData法,该法只有一个参数,就是要发送的数据。 GetData法 当本地计算机接收到远程计算机的数据时,数据存放在缓冲区中,要从缓冲区中取出数据,可以使用GetData法。GetData法调用规范如下:GetData

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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