问一个send函数的问题

freebob2000 2006-04-20 12:47:41
使用tcp协议
如何使send函数每次直接将包发出而不将几个包封装在一起发出
谢谢

...全文
310 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
dasiu 2006-04-21
  • 打赏
  • 举报
回复
问题可以变通解决:
发送/接收双方按照一定的协议发送/接收,例如:数据头+控制吗+数据长度+数据+crc验证+数据尾,在发送方按照协议发送数据,接受方捷到数据后,将数据存入缓冲区,然后分析所有接到的数据,。。。
这样解决相当可靠,合理。
freebob2000 2006-04-20
  • 打赏
  • 举报
回复
不是这个意思
比如
send()
send()
客户端一个recv就收到
我想要2个recv分别来收
striking 2006-04-20
  • 打赏
  • 举报
回复
那就循环一个一个发嘛,这么简单。
danscort2000 2006-04-20
  • 打赏
  • 举报
回复
其实你这个保证是没有意义的
在实验室也许OK
但是到了INTERNET上就不是这么回事情了
TCP是流,不能分割的
因为TCP由IP来实现
你的IP层是无法在整个链路中保证所有内容被封在一个包中而不被分解
万一人家TCP缓冲只有20个字节空余
那么你怎么封都没用
如果中间有个路由对包大小有苛刻要求,也有可能被分解
所以编写TCP程序一定要看成流,
看成包,只能自讨苦吃
另外没有什么粘包这种概念的
快乐鹦鹉 2006-04-20
  • 打赏
  • 举报
回复
创建和缓冲区一样大小的空间对象,把发送的内容填入。设置好内容结束标志,剩余空间存放垃圾信息。这样就不会两段合起来发了。
feeboby 2006-04-20
  • 打赏
  • 举报
回复
你可以禁用 Nagle 算法
setsockopt( sock, IPPROTO_TCP, TCP_NODELAY, (char *)&bNodelay, sizoeof(bNodelay));
striking 2006-04-20
  • 打赏
  • 举报
回复
那你要定义报文头。

就是在你的包 的 最前面 定义 一个 变量 存储此次发的包的 大小。

比如

struct head
{
int nSize;
}

struct Data
{
head h;
char data[10];
}

那head的大小是固定的, recv的时候, 先接收sizeof(head)的字节, 转化成head,
读取nSize的内容, 继续recv nSize的大小的数据。
DentistryDoctor 2006-04-20
  • 打赏
  • 举报
回复
自己在应用层先拼好?

18,356

社区成员

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

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