社区
网络编程
帖子详情
TCP发送多次,接受一次的问题
damingg
2009-09-30 11:30:53
一个进程通过socket向另外一个进程发送数据
发送了几次,比如每次的数据分别是:发送1,发送2,发送3, ... ,发送10
send了10次
接受的进程在接收后打印,结果是:
发送1
发送2发送3发送4...
只recv了2次
请问我怎么设置参数,使之发送几次,就接受几次?我想让这些数据分开接收!
...全文
1763
10
打赏
收藏
TCP发送多次,接受一次的问题
一个进程通过socket向另外一个进程发送数据 发送了几次,比如每次的数据分别是:发送1,发送2,发送3, ... ,发送10 send了10次 接受的进程在接收后打印,结果是: 发送1 发送2发送3发送4... 只recv了2次 请问我怎么设置参数,使之发送几次,就接受几次?我想让这些数据分开接收!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
10 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
jmcooler
2009-10-02
打赏
举报
回复
忘记说了,上述过程重复进行,直到收发双方交互完毕
jmcooler
2009-10-02
打赏
举报
回复
通常接收方需要一个大于等于发包大小的 Buffer 来用来接收数据,伪代码如下:
char szRecvBuff[发包大小];
int nTotalRecv = 0;
int nRecv = recv( socket, szRecvBuff + nTotalRecv, 发包大小 - nTotalRecv, 0 );
nTotalRecv += nRecv;
//只要收到数据,则解析包
char* pPackPtr = szRecvBuff;
while( nTotalRecv >= 包头长度 ) //看是否够包头长度
{
if( nTotalRecv >= 包头中的包长度 ) //看是否够包长度
{
//有了一个完整的包,处理这个接收包(pPackPtr)
nTotalRecv -= 包头中的包长度;
pPackPtr += 包头中的包长度;
}
else
break;
}
if( nTotalRecv > 0 && pPackPtr != szRecvBuff )
memmove( szRecvBuff, pPackPtr, nTotalRecv );
jmcooler
2009-10-01
打赏
举报
回复
你需要明确他们的不同点:
TCP 是面向连接的可靠的基于流的传输协议
UDP 是非连接的不可靠的基于数据报的传输协议
同时,他们都是 IP 协议之上的协议,而 TCP 在 IP 协议之上基于滑动窗口做了重传。UDP 基本上和 IP 协议相同,只是做了发送方的包分片和接收方的包重组
既然,TCP 是流,那么发送方无论发送多少个包,都会被变成流,流就是连续的字节,因此接收方可能会一次收到1字节,2字节,3字节,等等,都有可能。
那么对于 TCP 怎么收呢,一般,你定义字节的应用层协议栈,包头一般有2个部分,包长度 和 包标志。接收方尽力地收数据,每次只要收到包,先看收到的字节数是否够包头的4字节,如果够,则看是否够包长度。以此解析出包
sghgcn
2009-10-01
打赏
举报
回复
自定义格式吧。
通过特殊的约定,来接收和发送数据。
jxb_memory
2009-09-30
打赏
举报
回复
1.可以向楼上说的自己解包;
2.可以发送一次后等待对方回复,收到回复之后再发下一个包(当然,效率会低一些)这样就是你想要的结果了;
Conry
2009-09-30
打赏
举报
回复
1
tcp不可能设置的
这就是TCP的粘包,你可以搜索一下有好多粘包的解决办法
一般是一个包头部是长度,后面跟数据,这样根据长度就可以分割包了
blingpro
2009-09-30
打赏
举报
回复
TCP有粘包问题,接收端可能一次接收了好几次发送的数据,需要自定义格式来区分具体数据了
gotooker
2009-09-30
打赏
举报
回复
顶楼上,接受定长的数据收10次就可以了。
不动如岳
2009-09-30
打赏
举报
回复
[Quote=引用 1 楼 conry 的回复:]
tcp不可能设置的
这就是TCP的粘包,你可以搜索一下有好多粘包的解决办法
一般是一个包头部是长度,后面跟数据,这样根据长度就可以分割包了
[/Quote]接收的时候,先接收长度,在根据长度接收数据就行了
f515sf1sd15fsd1f56sd
2009-09-30
打赏
举报
回复
在send之后 就调用recv recv是阻塞的 不就可以了吗
TCP
通信
1、提供面向连接的可靠的字节流服务(一个报文
发送
端可以
一次
或
多次
发,接收端可以
一次
或
多次
收,不必来一个读一个);UDP是面向数据报的无连接,客户端发一个,服务端就收一个,不会合并几个UDP数据报。 2、一个
TCP
连接仅有两方进行通信,所以不能用于多播和广播。 全双工。 3、3次握手和4次挥手 MSS选项:最大分段大小,以字节数定义一个计算机或通信设备所能
接受
的分段的最大...
ThingsBoard如何
接受
设备通过
TCP
发送
的报文
TCP
(Transmission Control Protocol,传输控制协议)是互联网中的一种面向连接的、可靠的、基于字节流的传输层通信协议。它提供了点对点的通信,并且可靠地传递数据。
TCP
是Internet协议族中最为重要、应用最为广泛的一种协议。
LwIP
TCP
Client 解决长数据
发送
的困扰
问题
描述 LWIP 的
TCP
Client
发送
数据可以调用
tcp
_write() 函数,将数据储存在缓冲区里面,然后等待超时自动
发送
或者调用
tcp
_output()函数进行
发送
。 然而
tcp
_write() 函数 需要
发送
的数据过长时,将无法
发送
,并返回 ERR_MEM。
tcp
_write()函数解析
tcp
_write()的函数代码很多,就不细看代码了, 先看
tcp
_write()的完整函数: err_t
tcp
_write(struct
tcp
_pcb *pcb, const void
C#控制台应用——利用
TCP
协议
发送
,
接受
数据
C#控制台应用——利用
TCP
协议
发送
,
接受
数据客户端
发送
C#代码服务端
接受
c#代码 客户端
发送
C#代码 using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Thre...
网络编程
18,356
社区成员
64,165
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章