社区
网络编程
帖子详情
TCP发送多次,接受一次的问题
damingg
2009-09-30 11:30:53
一个进程通过socket向另外一个进程发送数据
发送了几次,比如每次的数据分别是:发送1,发送2,发送3, ... ,发送10
send了10次
接受的进程在接收后打印,结果是:
发送1
发送2发送3发送4...
只recv了2次
请问我怎么设置参数,使之发送几次,就接受几次?我想让这些数据分开接收!
...全文
1257
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
打赏
举报
回复
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
发送
大小
TPC
一次
可以
发送
的大小是多少:由两个因素决定:接收窗口和拥塞窗口; rwnd:接收方最多可以
接受
的字节大小;
TCP
不使用停等协议,而是
一次
发送
多个报文段,然后等待确认,通过滑动窗口机制,把
发送
缓冲区中的数据分为4类:已
发送
且确认的;已
发送
没有确认的;可以
发送
的;不能
发送
的;接收方也有一个接收缓冲区,里面有已经接收的,可以接收的,不能接收的;
发送
窗口大小就是可以接收的大小。每次
发送
方收到一个ACK,就把窗口下沿向前滑动,根据接收窗口算出
发送
窗口,并把上沿向前滑动;如果接收方rwnd=0,则启动一个定时器,超
TCP
通信
1、提供面向连接的可靠的字节流服务(一个报文
发送
端可以
一次
或
多次
发,接收端可以
一次
或
多次
收,不必来一个读一个);UDP是面向数据报的无连接,客户端发一个,服务端就收一个,不会合并几个UDP数据报。 2、一个
TCP
连接仅有两方进行通信,所以不能用于多播和广播。 全双工。 3、3次握手和4次挥手 MSS选项:最大分段大小,以字节数定义一个计算机或通信设备所能
接受
的分段的最大...
C#
TCP
Server和
TCP
Client之间
多次
的数据
发送
与接收
C#
TCP
Server和
TCP
Client之间
多次
的数据
发送
与接收
JAVA
TCP
长链接 通信 一个socket
多次
通信
对于一个双向的
tcp
会话,
tcp
应为双向的持续长链接, 而有可能我们会通过
多次
创建socket实现类似
多次
通信,此种做法是较为浪费资源了。 故 研究一下如何 一个socket
多次
通信 flush() java io 里面的方法 ,清空缓冲区,立即输出数据 强调一下, flush 之前,其io流 所加载的数据 最后应有个换行符,否则程序会阻塞 代码如下: Server import java.io.BufferedReader; import java.io.BufferedWriter; import j
TCP
发送
和接收数据
学习笔记--
TCP
发送
和接收数据
TCP
协议
TCP
通信黏包
TCP
协议
TCP
通信 黏包
网络编程
18,356
社区成员
64,214
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章