socket多线程问题
我的毕业设计是用socket(要求不能用CSocket类派生)做一个文件传输工具。分为“接收端”和“发送端”。“接收端”监听网络,然后“发送端”向一个已经开始监听网络的“接收端”发送文件,文件传输的socket连结是在线程中动态建立的!而不像网上很多源代码是,事先让“接收端”和“发送端”建立连结,文件传输只限于这两台计算机之间。我的设计是可以让“接收端”同时接收不同发送端发送过来的文件;“发送端”也可以同时向不同的接收端发送文件。
我想做成多线程的,就像FlashGet那样,可以同时传输多个文件(多线程);可以对每一个传输中的文件进行:“开始”、“暂停(包括文件断点续传)”、“停止”、“删除”这些基本的操作。
目前我已经实现了传输功能,可是我不知道怎么“停止”文件的传输。也就是说,我现在的做出来的程序,一旦文件开始传输,就失去了对文件的控制,不能使文件传输停止。但是文件传输不会出错(局域网内)。
在网上找了很多的源代码来看,但都是单线程的(单线程中停止传输很好实现)。自己写出这里也停下来了。我为每一个传输文件写一个线程,但仅仅用多线程实现了传输的功能。而对于其他的功能比如:“暂停(包括文件断点续传)”、“停止”,却不知道怎样在各个线程中控制。因为我不知道怎样,在传输线程和主线程(程序线程)之间交换数据,怎样管理我建立起来的那些文件传输的线程。我只是想做得看上去像FlashGet那样。
总的说来,我遇到的棘手的问题就是:怎样在多线程中控制文件的传输????
还有我并没有创建自己的socket类,也没有派生CSocket类!请高手指点迷失的我~~~~
问题点数:0、回复次数:3Top
1 楼wwwllg(野蛮人)回复于 2004-05-03 17:35:00 得分 0
可以在你发送的时候,每次发一个固定大小的包,每次发送的时候,检查一个标志,比如是否是:“开始”、“暂停(包括文件断点续传)”、“停止”、“删除”这些基本的操作,根据不同的操用做不同的动作Top
2 楼astrolabe()回复于 2004-05-10 15:49:46 得分 0
我的想法:
首先要把你的socket通信改为异步模式,例如使用重叠I/O,保证线程不会阻塞;
再者将通讯线程改为界面线程,这样可以灵活响应消息,容易控制Top
3 楼sosoxman()回复于 2004-05-10 16:15:05 得分 0
异步模式。
线程池来管理客户端的连接。
至少你可以一个队列里管理存储所有的客户端连接。
至于断开文件传输,你可以采用消息的方式进行控制。
定义C/S之间的消息格式。
比如:
// 消息头
typedef struct tagHeadMsg{
int MsgType;
int MsgClass;
int MsgLength;
int CRC;
int Flag;
}tHeadMsg, *ptHeadMsg;
// 主消息
typedef struct tagMainMsg{
tHeadMsg Head;
void * Buffer;
}tMainMsg, *ptMainMsg;
再定义具体的控制消息
Top




