关于socket使用TCP方式发送与接收顺序的疑问
本人在做一个视频传输的程序,目的是将客户端jpeg格式的视频发送到服务器端。发送的过程如下:
1、客户端取得一帧图像的大小,将大小数据(int型,占4 byte)发送到服务器端。
2、在发送图像大小后开始发送图像数据。
采用的是阻塞式的发送与接收,没有标记帧头与帧尾,发送端只管按照发送的过程发送,接收端按照相应的过程接收,一帧发完延迟一会发下一帧。
发送代码片段如下:
接收代码片段如下:
测试结果:大部分时候发送接收都没问题,能够正常接收图像大小和数据。但是有时候接收不到图像的大小,导致程序崩溃。在一番测试调查后发现正常情况下第一个接收的iRecv的值是等于4的(也就是一个int的大小,即send(slisten, &iJpegSize , sizeof(&iJpegSize ), 0); 这段程序发送的数据,存储了图像大小的数据),但是在程序崩溃的情况下第一个接收的iRecv的值不是等于4,
而是等于2048(即iSend = send(slisten, JpegBuf + iSendCnt , BUF_LENS, 0); 这段代码发的数据),在这种情况下iRecv等于4的会被延后,可能是第3个,也可能是第10个。
我的疑惑就是TCP不是顺序接收数据的吗?为什么会出现先发的socket后到,后发的先到的情况?而且按理来说网络发送会出现合并包、分包的情况,就是4 byte的数据很可能会和后面的数据合并成一个包一起发送,但是我这里却还是会收到4 byte这个数据包,有高手能够解释下吗?谢谢
1、客户端取得一帧图像的大小,将大小数据(int型,占4 byte)发送到服务器端。
2、在发送图像大小后开始发送图像数据。
采用的是阻塞式的发送与接收,没有标记帧头与帧尾,发送端只管按照发送的过程发送,接收端按照相应的过程接收,一帧发完延迟一会发下一帧。
发送代码片段如下:
#define BUF_LENS 2048
……
send(slisten, &iJpegSize , sizeof(&iJpegSize ), 0);//获得图像大小
while(1)
{
iSend = send(slisten, JpegBuf + iSendCnt , BUF_LENS, 0);
Sleep(1);
iSendCnt += iSend;
if(iSendCnt == iJpegSize)//发送完成
{
break;
}
……
}
接收代码片段如下:
#define BUF_LENS 2048
while(1)
{
iRecv = recv(slisten, buffer , BUF_LENS, 0);
if(!m_IsGetSize)
{
iJpegSize = GetJpegSize(buffer);//由char转换得到int的图像大小数据
m_IsGetSize = TRUE;
}
else
{
iRecvCnt += iRecv;
if(iRecvCnt == iJpegSize)
{
break;
}
}
}
测试结果:大部分时候发送接收都没问题,能够正常接收图像大小和数据。但是有时候接收不到图像的大小,导致程序崩溃。在一番测试调查后发现正常情况下第一个接收的iRecv的值是等于4的(也就是一个int的大小,即send(slisten, &iJpegSize , sizeof(&iJpegSize ), 0); 这段程序发送的数据,存储了图像大小的数据),但是在程序崩溃的情况下第一个接收的iRecv的值不是等于4,
而是等于2048(即iSend = send(slisten, JpegBuf + iSendCnt , BUF_LENS, 0); 这段代码发的数据),在这种情况下iRecv等于4的会被延后,可能是第3个,也可能是第10个。
我的疑惑就是TCP不是顺序接收数据的吗?为什么会出现先发的socket后到,后发的先到的情况?而且按理来说网络发送会出现合并包、分包的情况,就是4 byte的数据很可能会和后面的数据合并成一个包一起发送,但是我这里却还是会收到4 byte这个数据包,有高手能够解释下吗?谢谢
...全文
相关推荐
C# 使用Socket发送和接收TCP数据
C# 使用Socket发送和接收TCP数据,包含客户端和服务器端,发送Send,监听Listen ,C#运行环境VS2010
C语言实现TCP Socket客户端数据发送
本文还有配套的精品资源,点击获取 简介:网络编程是IT领域的重要组成部分,而Socket编程是客户端和服务器间通信的关键技术。本示例展示了如何使用C语言进行TCP Socket通信,包括创建连接、发送数据、接收数据、封装函数以及错误处理等方面。通过理解这些基础操作,初学者可以打下网络编程的坚实基础,并进一步探究多线程、异步I/O等高级主题,提升系统的稳定性和健壮性。 ...
TCP socket 请求报文发送工具
模拟TCP请求或简单的socket请求报文发送工具,免安装绿色版本
C# socket发送(接收)文件
C#使用socket发送(接收)文件的程序,任何文件均可。 其中SingleSendForm是一次发送一个文件,MultiSendForm可以一次选择多个文件,然后依次发送。
CsharpSocketTCPIPC# 使用Socket发送和接收TCP数据
A控制B,那A就是上位机,A发送协议内规定的一串数据,B接收到确认数据没错再返回其对应的数据。相对应的B就是下位机,plc常见的上位机有pc,HMI,其他plc,与pc通讯,


网络编程
