TCP发送多次,接受一次的问题

damingg 2009-09-30 11:30:53
一个进程通过socket向另外一个进程发送数据
发送了几次,比如每次的数据分别是:发送1,发送2,发送3, ... ,发送10
send了10次

接受的进程在接收后打印,结果是:
发送1
发送2发送3发送4...
只recv了2次

请问我怎么设置参数,使之发送几次,就接受几次?我想让这些数据分开接收!
...全文
1257 10 打赏 收藏 转发到动态 举报
写回复
用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]接收的时候,先接收长度,在根据长度接收数据就行了
  • 打赏
  • 举报
回复
在send之后 就调用recv recv是阻塞的 不就可以了吗

18,356

社区成员

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

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