关于tcp粘包问题,还望大神指点

问题描述

关于tcp粘包问题,还望大神指点

看到说tcp粘包问题的可能原因之一是接收端未及时从缓冲区接收数据造成的。于是我想自己
测试一下,就写了一个程序。
服务端是这样的:等待客户端连接成功之后,先等待10秒钟,然后在while循环里用read读取
读取数据,每次读取四个字符。

客户端是这样的:与服务端连接成功之后,立即用write函数循环发送4个字符,每次发送一个字符,共发送四次。

但是我发现服务端在10秒钟过后,并没有像我预期的直接把这四个字符一次性全部读取,而是循环读了四次,一次一个。。这是为什么?在服务端读取之前,客户端不是已经把四个字符都发过来了吗?服务端读取之前应该已经有四个字符了啊,为什么没有一次性读取,而是分了四次?

还请了解的能帮忙解答下。

解决方案

最近需要用TCP传输大量数据,但是中间出现了一些问题。
又问本人菜鸟,什么都是自己摸索!
其中就出现了粘包问题。
粘包问题可以看看下面的链接,下面讲解的很详细
粘包问题链接:点击打开链接
?
?
而我发送的大量数据包,每次发送的长度不相等。
微软对TCP发送的数据优化算法还是有用的,可以不需要设置“发送不延迟”。
所以就在每次发送数据包的开头定义一个定长大小的结构体,里面描述一些......
答案就在这里:TCP粘包问题

解决方案二:

你可以参考这么做:
先发送发送数据包的长度和包编号,然后接收端以此长度开启一个接收空间,编号作为组包顺序,就开始传输真正的数据,客户端若没接受到该长度的数据,则继续等待,有的写入保存

时间: 2025-01-25 07:12:10

关于tcp粘包问题,还望大神指点的相关文章

Acm一道动态规划的入门题,还请大神指点

问题描述 Acm一道动态规划的入门题,还请大神指点 描述 看,Alice和Bob又在玩游戏了. 游戏规则如下: Alice在纸上写出N个整数a,Bob写出一个整数S.他们轮流从这N个数中取任意个,使得这些数的和等于S.Alice先取.轮到某个人不能取时,这个人就输了.问最后的获胜者是谁.注意:两个人不能有相同取法. 输入 首先输入一个整数T,表示有T组测试数据(T≤100). 每组测试数据包含两行.第一行包含2个整数N(1≤N≤2000)和S(0≤S≤5000):第二行包含N个整数a(0<a≤1

ip 点击-关于IP方面的。还望大神指点

问题描述 关于IP方面的.还望大神指点 两台 笔记本连在无线路由器上,两台电脑IP地址自动分配的.两台电脑点击百度上的同一家网站,百度会记录那家网站点击增加一次or两次? 解决方案 两台笔记本连同一个无线路由,访问百度,百度看到的是同一个ip访问了两次,因为这个外网ip都来自于无线路由/isp分配的那个外网出口,至于百度会怎么计数,这是它的实现问题 解决方案二: 是一个IP,两个pv

python-安装reviewboard 安装时报错。还请大神指点

问题描述 安装reviewboard 安装时报错.还请大神指点 C:memcached>rb-site install D:reboard Traceback (most recent call last): File "C:Python27Scriptsrb-site-script.py", line 8, in load_entry_point('ReviewBoard==2.5.3', 'console_scripts', 'rb-site')() File "c

代码-java实现数字替换成*,求大神指点

问题描述 java实现数字替换成*,求大神指点 我现在要实现150****8558,这样的样式,我是新手,还请大神指点,最好是贴上代码.谢谢! 解决方案 /** * 对一个字符串,指定字符"段"替换成对应的字符 * @param resStr 字符串 * @param begin 开始 * @param end 结束 * @param replaceStr 替换字符 * @return */ private static String strReplace(String resStr,

sql server-虚拟银行转账记录功能无法实现,望各位大神指点指点

问题描述 虚拟银行转账记录功能无法实现,望各位大神指点指点 错误如下: 131110002 131110002 wjj com.microsoft.sqlserver.jdbc.SQLServerException: 列名或所提供值的数目与表定义不匹配. 代码如下: <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

Java网络编程之TCP粘包拆包

TCP是个"流"协议,所谓流,就是没有界限的一串数据.大家可以想象河里的流水,他们是连成一片的,其间并没有分界线.TCP底层并不了解上层业务数据的具体含义,他会根据TCP缓冲区的实际情况进行包的划分,所以在业务上认为,一个完整的包可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送.这就是TCP所谓的拆包和粘包的问题. 一.TCP粘包/拆包问题说明 我们可以通过图解对TCP粘包和拆包问题进行说明,粘包问题如图. 假设客户端分别发送了两个数据包D1和D2给服务

TCP协议 及 TCP粘包现象

TCP协议 及 TCP粘包现象 TCP,Transmission Control Protocol,传输控制协议.这是一个面向连接的传输层协议. 与之相对的无连接协议为UDP,用户数据报协议. 传输层的基本数据单位为--报文.网络层--包.数据链路层为--帧.物理层--比特. TCP提供面向连接的可靠服务,传送数据之前必须先建立连接,传送完毕要释放链接. 服务器端使用的端口号:熟知端口号--0~1023:登记端口号--1024~49151. 客户端使用的端口号--49152~65535.这种端口

tcp-为什么我编的抓包程序抓的TCP包源地址都是本机地址啊,下面是源码,新手求大神指点!!

问题描述 为什么我编的抓包程序抓的TCP包源地址都是本机地址啊,下面是源码,新手求大神指点!! #include #include #include using namespace std; #define SIO_RCVALL _WSAIOW(IOC_VENDOR, 1) #define MAXLEN 65535 //定义IP报头 typedef struct _iph { unsigned char ver_len; unsigned char ser; unsigned short dat

Socket编程 (异步通讯,解决Tcp粘包) - Part3

原文 http://www.cnblogs.com/zengqinglei/archive/2013/05/14/3078842.html Socket编程 (异步通讯,解决Tcp粘包) 从上一章的通讯中,我们发现如果使用Tcp连续发送消息会出现消息一起发送过来的情况,这样给我们编程造成一定的问题,给我们的信息解析造成一定的问题.那么这篇文章就将针对以上问题给出解决方案......   问题一般会出现的情况如下,假设我们连续发送两条两天记录("我是liger_zql"): 模拟发送示例