网络发送数据包

Althonx1024 2009-09-08 09:23:11
socket套接字编程,需要在发送数据包结构的时候根据当前用户输入的内容长度来增减数据包的大小,请问有什么方法能做到吗?
...全文
218 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
ETIAN 2009-09-08
  • 打赏
  • 举报
回复
send()的len参数可以调节发送数据的长度
int send(
__in SOCKET s,
__in const char* buf,
__in int len,
__in int flags
);

独孤过儿 2009-09-08
  • 打赏
  • 举报
回复
补充一下:关于分片和重组,可以参考RFC 791。这个只是针对IPv4的哦,IPv6不支持分片和重组
独孤过儿 2009-09-08
  • 打赏
  • 举报
回复
如果你用TCP来发送,不需要关心包的长度问题

总长超过MTU的包,在IP层会被分片和重组,这是IP协议的内容,不需要上层来care
「已注销」 2009-09-08
  • 打赏
  • 举报
回复
...
「已注销」 2009-09-08
  • 打赏
  • 举报
回复
我需要了解的是怎么发送变长数据包,谢谢
oLINo 2009-09-08
  • 打赏
  • 举报
回复
构造包的时候,包结构头不要添好数据段长度。服务器接收时候先得到长度,再按照长度来接收数据。
「已注销」 2009-09-08
  • 打赏
  • 举报
回复
C++定义数组要在编译时确定长度
这里需求是根据用户输入之后再确定数组长度,不能在编译期确定
  • 打赏
  • 举报
回复
[Quote=引用楼主 althonx1024 的回复:]
socket套接字编程,需要在发送数据包结构的时候根据当前用户输入的内容长度来增减数据包的大小,请问有什么方法能做到吗?
[/Quote]

你接收用户输入,存到数组啊,然后把这个数组send入socket的缓冲区。
请问你有什么问题?
「已注销」 2009-09-08
  • 打赏
  • 举报
回复
我也不想把自己归为邪教啊,但老板他非要节约这点个数据,没办法,我不如地狱谁入地狱,刚才稍稍测试了下,基本可行...
独孤过儿 2009-09-08
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 althonx1024 的回复:]
在补充理解下,
结构体定长600,其中尾部500为用户输入的部分
得知用户只是输入了200.
那么实际发送的时候,只发送300出去,后面的空数据部分不发了
[/Quote]
你误入歧途了...协议不是这么玩的!

正常的发送过程是这样的:

应用层将自己这层的消息发送给下一层,然后下一层计算出从上层来的数据长度,然后自己在这层添加上协议

头,然后继续发送给自己的下一层,下一层再做同样的操作

所以对于协议栈来说:下层是不应该,也不能为上层分配一个固定大小的空间,等着上层的数据到来,然后装

进去的;必须要把上层的数据作为自己的一个净荷封装起来
das_jack 2009-09-08
  • 打赏
  • 举报
回复
struct sendbuffer
{
int buf_len;
char *buf;
};
根据用户的输入,初始化这个结构,buf_len = 用户输入的字节数,buf指向用户输入的缓冲
然后就是用集中写send_v(iov[2])发送长度跟内容
「已注销」 2009-09-08
  • 打赏
  • 举报
回复
在补充理解下,
结构体定长600,其中尾部500为用户输入的部分
得知用户只是输入了200.
那么实际发送的时候,只发送300出去,后面的空数据部分不发了
「已注销」 2009-09-08
  • 打赏
  • 举报
回复
现在想法就是把有变动的数据放在结构体的尾部
申请原始结构体时,对于其中的char aaa[]数组还是使用固定长度,例如500
然后做一个输入缓冲,对上面的aaa数组进行拷贝.
得知输入缓冲区实际字符长度,然后把结构体人为得知的空数据不发送出去

请问这样做有没有什么很大很恶心的缺点啊?(字符串结尾'\0'已被处理了,或者在接收端解析的时候进行处理)
slblake 2009-09-08
  • 打赏
  • 举报
回复
这个不需要你操心的,你只要构造好你要发送的数据包就可以了。长度根据数据包的实际大小来确定。

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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