receive到数据后,如何将控制信息和真正数据分开

_hotmail 2004-08-11 06:43:54
不知道说的对不对
连接成功后,
第一次receive 数据时,传的是控制信息,
从buffer取出数据,然后转换为文件信息结构,察看控制信息中的数据,
如果接受请求,向客户端发个返回信息,新开一个线程,专门接收数据,以后传来的都是数据了,也不用判断了
而客户端接到返回信息后,同样转换buffer中的信息到文件结构,如果同意传输文件,也是先开个线程传输。
这样的话,以后receive到的信息怎么办,以后receive到的信息都是数据了,也转换不成结构了,这不出错了,而每次传数据都把数据放到结构中,其中还有不必要的文件信息,这样也不好。判断buffer长度行不行,比如,结构长度为5,而传数据长度为100,每次判断长度,如果长度是5的话就转换,否则抛弃,这样也不对,抛弃了,线程中的数据怎么办,不知道我说的命不明白

还有个问题就是怎么转换成结构信息
receive(buffer,sizeof(buffer))
struct file{int filename,int filesize};
然后怎么转换

如果客户端还要同时传别的文件,是不是有新建了一个socket,对上面的那个没影响。
...全文
186 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
herofour444 2004-08-13
  • 打赏
  • 举报
回复
定义桢结构,加入桢头标记,类型标记,就很容易分检出数据,

把桢头标记,类型标记根据自己定义的桢协议去掉不就是数据吗



呵呵,怎么实现
UDX协议 2004-08-13
  • 打赏
  • 举报
回复
我的意思,是如果你接收的时候,本次接收,只收到了msg结构的一半,而别一半,因为网络原因,在下一次发送的时候,才能发全。

这个时候,你的msg处理会有异常。
lgchina97 2004-08-13
  • 打赏
  • 举报
回复
定义桢结构,加入桢头标记,类型标记,就很容易分检出数据,

把桢头标记,类型标记根据自己定义的桢协议去掉不就是数据吗
pclili 2004-08-12
  • 打赏
  • 举报
回复
加个标志判断就可以了。
有兴趣可以截QQ,MSN之类的数据包,里面就有N多标志段。
DentistryDoctor 2004-08-12
  • 打赏
  • 举报
回复
加个头,再加个结束标志。
blueeye80 2004-08-12
  • 打赏
  • 举报
回复
楼上的, 说说你的妙计。 ^_^
HuangRG 2004-08-12
  • 打赏
  • 举报
回复
wwwllg(wwwllg):
为什么msg只发了一半?如果一个套接字就处理传输文件方面的用这个肯定是行的.整个文件在传输过程中也就是字节流.用TCP传的,不会出现你说的情况的.
danielzhu 2004-08-12
  • 打赏
  • 举报
回复
自己参照比较成熟的协议,制定一个满足自身要求的东西,就OK了
_hotmail 2004-08-12
  • 打赏
  • 举报
回复
那如何加标志段
UDX协议 2004-08-11
  • 打赏
  • 举报
回复
楼上的,只能对要求不高的地方用。

如果,当msg结构只发了一半呢?

hehe.

山人自有妙计
HuangRG 2004-08-11
  • 打赏
  • 举报
回复
楼主说得不清楚.
你可以定义两个结构:
struct file_info
{
char file_name[256]; // 文件名
u_int file_size; // 文件大小
...... // 其它对你有用的信息
};

struct file_data
{
u_int data_length; // 这次传输数据的长度
char file_data[DATA_LENGTH]; // 文件数据 DATA_LENGTH一般设为8192
... ... // 其它有用的东西
};

然后定义一个这样的结构,做为公共消息包:
struct msg
{
u_int type; // 类型
union
{
struct file_info file_info;
struct file_data file_data;
}Un;
};
你发包与接包就对msg这个结构进行操作.
oyljerry 2004-08-11
  • 打赏
  • 举报
回复
我最近学习接收结构
iReadLen = recv(socknew,(char*)&pack,sizeof(PACKET_TEST_t),0);
if(iReadLen>0){
m_listbox.AddString("接收成功");
CString chartemp;
chartemp.Format("接收到的数据为%s ",(char*)pack.CRYTYPE);
}
cxf1976 2004-08-11
  • 打赏
  • 举报
回复
强制转换,不过都要是char类型
zhangyilan 2004-08-11
  • 打赏
  • 举报
回复
简单的方法就是加一个标志头
通过标志头来判断是什么

18,356

社区成员

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

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