首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

自定义协议,可同时进行多个发送和接收文件的程序求教?解决方法

2012-03-25 
自定义协议,可同时进行多个发送和接收文件的程序求教?小弟网络编程刚起步,水平很菜,希望大家多多指教,先谢

自定义协议,可同时进行多个发送和接收文件的程序求教?
小弟网络编程刚起步,水平很菜,希望大家多多指教,先谢谢

1.协议如下,初次自己定义协议,可能想的不周到,希望大家指教

C/C++ code
// 自定义文件传输协议MYFTPtypedef struct _MYFTPHDR{    char *pFileName;                                // 文件名    unsigned long fileSize;                            // 文件大小    unsigned char selfFlag;                            // 本协议标志,必须为123    unsigned char msgType;                            // 消息类型:0为请求传输文件,1为回应请求并接受,                                                    // 2为回应请求并拒绝,3为正在传输文件,4为中止传输,5为中止接收    unsigned perSize;                                // 文件片大小    unsigned long perIndex;                            // 当前文件片索引,基于0} MYFTPHDR;


2.基本思路: 将要传输的文件分为一个个小的文件片传输,用我定义的协议头和文件片填充TCP套接字要传输的buf的数据部分,接收方接到包后一个个接起来组成新文件
3.打算写成一个类,大概的思路是在构造函数中创建一个线程用来接收TCP连接请求,每建立一个连接,创建一个新线程来接收文件并处理(细节就不累赘了),这是接收部分的;发送部分也差不多,每次要发送文件,都建立新的连接来发送

现在想问问大家这样的思路哪里有问题,有做过类似的一般是怎么搞的,协议写的哪里有问题,只用一个套接字来建立多个连接可以么?如果问题不大,这么搞的速度会快还是慢?多谢各位帮忙了

[解决办法]
1 定协议不是定结构。报文和C的struct不是一回事。比如你的char* pFileName,传给对方就成了野指针。你应该定报文的每个字节每个bit的含义。
2 可以分包,不过TCP传文件已经很方便了,有点多此一举。FTP协议在传文件的时候并不分包,只处理ftp命令。
3 具体实现比较自由。不过...构造函数开线程不好啊...错误不能返回。另外角色的区别不是发送和接收,是服务器和客户端。
基于TCP的服务器一直在监听连接请求,一旦有客户端连接,就创建一个线程(以前是进程),创建一个连接对象,连接对象的功能就是服务器提供的服务。监听的socket和连接socket是不同的,只需要监听一个socket,可以建立多个连接。
如果客户并发很多会导致线程太多,此时要考虑iocp。
[解决办法]
如果有多个资源点可以立多个连接,否则我认为建立多个连接是没有意义的
传输大文件,可以考虑多线程分块发送,这样效率会高些。

如果对效率要求不高,我建议你看下TransmitFile这个函数
[解决办法]
如果是直接发送结构体的话,结构体中最好不要含有指针成员,你是要做客户端还是服务端?服务器端的话可能会要求性能比较高,IOCP+内存池
[解决办法]
文件名建议用数组
并发用重叠IO比较好
然后
建议你去看看飞鸽传书的代码
这个是开源的
可能刚开始你看不懂
不过慢慢来
你可以有目的的看文件传输这一块
[解决办法]
char *pFileName; // 文件名

sock传输结构体.可不能用char*啊. 要有固定大小的 char pFileName[127];
不然出错,egg pain!!
[解决办法]
探讨

引用:

文件名建议用数组
并发用重叠IO比较好
然后
建议你去看看飞鸽传书的代码
这个是开源的
可能刚开始你看不懂
不过慢慢来
你可以有目的的看文件传输这一块

恩 我之前也用过飞鸽传书 好像挺多BUG的 不知道是不是我下载的那个不好

[解决办法]
没必要把文件名传给对方吧,收到文件起什么名字是接收方的事。而且每个数据片传一次文件名显然是浪费网络资源。
[解决办法]
http://blog.csdn.net/chexlong/article/details/6723455 前些天写的一篇博客,供参考!
[解决办法]
探讨
引用:

1 定协议不是定结构。报文和C的struct不是一回事。比如你的char* pFileName,传给对方就成了野指针。你应该定报文的每个字节每个bit的含义。
2 可以分包,不过TCP传文件已经很方便了,有点多此一举。FTP协议在传文件的时候并不分包,只处理ftp命令。
3 具体实现比较自由。不过...构造函数开线程不好啊...错误不能返回。另外角色的……

热点排行