社区
Linux/Unix社区
帖子详情
问个TCP的发送接收问题
zly1980
2006-07-11 10:52:16
在网络的二端(tcp/ip连接),发送端不断的send(一个结构指针)
接收端不断的recv(一个结构大小)
那么接收到的是不是一定是一个完整的结构?可能出现只发送了一个结构的一半数据吗?如果可能是否需要使用缓冲保存?再根据缓冲的大小是否满足sizeof(结构)后再去解吸
...全文
513
18
打赏
收藏
问个TCP的发送接收问题
在网络的二端(tcp/ip连接),发送端不断的send(一个结构指针) 接收端不断的recv(一个结构大小) 那么接收到的是不是一定是一个完整的结构?可能出现只发送了一个结构的一半数据吗?如果可能是否需要使用缓冲保存?再根据缓冲的大小是否满足sizeof(结构)后再去解吸
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
18 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
zly1980
2006-07-17
打赏
举报
回复
lear19820104(峰) ( ) 信誉:84
结构会有字节续对齐问题,最好不要用结构传输-都是C++写的,用了#pragma pack(1)
郁闷,一个说会粘连一个说不会粘连
lear19820104
2006-07-16
打赏
举报
回复
结构会有字节续对齐问题,最好不要用结构传输
zly1980
2006-07-15
打赏
举报
回复
jammyxu() :主要注意兩點﹐能足夠准確的辯別起始位(應該是多個字節)﹐從起始位開始﹐Size足夠。
你的意思是发送的时候:
MyStruct senddata;
char sendbuf[];
sprintf(sendbuf,"%s",flagstring);
memcpy(sendbuf+flagstring,&senddata,sizeof(senddata));
memcpy(sendbuf+flagstring_len+sizeof(senddata),"CRCCODE",len of crccodelen);
send(fd,sendbuf,flagstring_len+sizeof(senddata)+crccodelen);
是这样吗?
linaxing
2006-07-15
打赏
举报
回复
linaxing(孩子她爹)
为什么不会?
一端是原始套节子,一端是tcp套节子
===============================
人家说了是用TCP/IP,所以不会
i ama
2006-07-15
打赏
举报
回复
自己定分隔符。TCP包可能会发生粘连的。
zly1980
2006-07-15
打赏
举报
回复
但是接收的时候我接收多大的大小?
是每次请求的接收大小都是flagstring_len+sizeof(senddata)+crccodelen吗?
再分解一下里面的格式,把结构用MEMCPY提取出来是吧?
jammyxu
2006-07-14
打赏
举报
回复
接收buffer的size無嚴格限制﹐但要比結構的大﹐2倍以上最好﹐結構的前面几個字節定義為起始位﹐接收到它并且size足夠﹐就用memcpy copy到接收的結構中去
主要注意兩點﹐能足夠准確的辯別起始位(應該是多個字節)﹐從起始位開始﹐Size足夠。
如果必要的話﹐結構的后面加一個CRC Check作正確性檢查
zly1980
2006-07-14
打赏
举报
回复
结构体定义用了
#pragma pack(1)
#pragma pack()
sizeof()得到的大小是一样的。
playmud((猪头流氓)(鄙视老迈)(抵制日货):学习了什么是:一端是原始套节子?
我都是socket(AF_INET,SOCK_STREAM,0);
hundlom
2006-07-13
打赏
举报
回复
TCP可以窥探数据的大小,可以用这个方法试试。
一般在传输的时候转为char传输。
结构体可能由于系统的区别,导致结构体在不同系统上的大小不同。
orcd
2006-07-13
打赏
举报
回复
学习
playmud
2006-07-13
打赏
举报
回复
linaxing(孩子她爹)
为什么不会?
一端是原始套节子,一端是tcp套节子
zly1980
2006-07-12
打赏
举报
回复
select可以得到当前可读数据的大小吗?
linaxing
2006-07-12
打赏
举报
回复
不会!但是最好不要直接传结构,历史已经证明这不是一个好方法(wall就是一个例子)
playmud
2006-07-12
打赏
举报
回复
可能出现你说的情况,比如数据包太大需要进行ip层的分片,如果发送了一半网络断了,而你接收端用了非阻塞方式,或者原始数据包的形式,那就出现你的情况了。如果你使用tcp套接字我觉得不会出现你说的问题了。
sourceid
2006-07-12
打赏
举报
回复
光发送结构指针没有用,接收端是收不到这个结构里的数据。
zly1980
2006-07-12
打赏
举报
回复
linaxing(孩子她爹) ( ) 信誉:100 :具体点。
zly1980
2006-07-11
打赏
举报
回复
有关系吗?
typedef struct
{
int xx;
...
char buf[111];
}NAME;
累世这样的。
yingge
2006-07-11
打赏
举报
回复
怎么样的结构啊?
TCP
发送
和
接收
数据
学习笔记--
TCP
发送
和
接收
数据
TCP
协议
TCP
通信黏包
TCP
协议
TCP
通信 黏包
TCP
通信
发送
和
接收
数据(Socket、ServerSocket)、
TCP
通信案例
目录
TCP
TCP
发送
接收
数据
发送
数据Socket
接收
数据ServerSocket
TCP
通信案例1
TCP
接收
数据后给出反馈案例2
TCP
接收
数据后给出反馈案例3
TCP
接收
数据后给出反馈案例4
TCP
概述:
TCP
通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket对象,从而在通信的两端形成网络虚拟链路,一旦建立了虚拟的网络链路,两端的程序就可以通过虚拟链路进行通信 Java对基于
TCP
协议的网络提供了良好的封装,使用Socket对象来代表两端的通信端口,并通过Socket产生IO流来进行网络通
java实现
TCP
的
发送
和
接收
数据
Tcp
协议是面向连接的,可靠的的协议,
Tcp
是通过三次握手建立连接,
Tcp
的
发送
和
接收
都是端对端的
发送
和
接收
。 一、
发送
端的编程思路 1、创建一个
发送
端的socket; 2、获取到输出流; 3、将需要写入的数据写在控制台。 二、
接收
端的编程思路 1、创建一个
接收
端的ServerSocket; 2、侦听并接受到此套接字的连接,返回一个Socket对象; 3、获取到输入流; 4、将获取到的数据打印在控制台上。 三、代码如下 package net; ..
TCP
/IP传输层协议实现 -
TCP
接收
窗口/
发送
窗口/通告窗口(lwip)
1、
tcp
通告窗口/
接收
窗口/
发送
窗口
接收
端有一个
接收
窗口大小,
接收
端只能
接收
这么多数据,
接收
窗口的数据需要被上层
接收
后才释放更大
接收
空间,才可以
接收
更多数据;
接收
窗口之前的数据已经被
接收
,再次
接收
到
接收
窗口之前的数据可以认为是重复
发送
的,不处理,
接收
窗口之后的数据不能
接收
,超出
接收
范围直接丢弃。
接收
端通过
tcp
首部通告窗口字段告诉对端本地可以可以
接收
多少数据,用于控制
发送
端的
发送
窗口大小。
发送
端有一个
发送
窗口,
发送
窗口大小即为对端通告窗口的大小,只有
发送
窗口内的
tcp
报文才可以
发送
。
发送
窗口之
tcp
发送
和
接收
的原理
需要理解的3个概念 1.
TCP
socket的buffer 每个
TCP
socket在内核中都有一个
发送
缓冲区和一个
接收
缓冲区,
TCP
的全双工的工作模式以及
TCP
的流量(拥塞)控制便是依赖于这两个独立的buffer以及buffer的填充状态。
接收
缓冲区把数据缓存入内核,应用进程一直没有调用recv()进行读取的话,此数据会一直缓存在相应socket的
接收
缓冲区内。再啰嗦一点,不管进程是否
Linux/Unix社区
23,121
社区成员
74,506
社区内容
发帖
与我相关
我的任务
Linux/Unix社区
Linux/Unix社区 应用程序开发区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章