|
有人建议组织编程大赛,我就先来出一个题目给大家,作为活动的实验吧。为提高参与性,我出的这个题目相对比较简单,同时也具有一定的应用价值。不知大家对它感不感兴趣。
题目如下:
大家都用过P2P软件吧?这类软件为我们提供了一个分布式文件资源系统,我们可以方便地用它来共享软件、电影、音乐、电子书等等。如果用做分布式协同开发小组,协同开发小组可以不使用集中管理的CVS服务器就可以进行良好地合作。
好了,闲话少说。现在,我们来做一个通信决策程序,现在已经提供一个类CPPComm,封装了UDP协议和数据打包、数据压缩、加密等细节操作,参赛者不需要了解其内部技术细节,只需要设置回调函数指针和调用其方法即可。类的定义如下:
class CPPComm
{
private:
.....
public:
int SendMsg(int TargetAddr[4],char * msg);//阻塞模式。成功返回发送的字节数,失败返回0。
int GetMsg(int FromAddr[4],char * msg);//阻塞模式。成功返回收到的字节数,失败返回0;
int WriteMsg(int TargetAddr[4],char * msg);//非阻塞模式。成功返回发送的字节数,失败返回0。
int ReadMsg(int FromAddr[4],char * msg);//阻塞模式。成功返回收到的字节数,失败返回0;
void (*OnGotMsg)(int FromAddr[4],char * msg);//收到数据后的响应事件,使用时用自己定义的函数指针设置它。
}
//以上int[4]均为目标主机的IP地址,例如202.101.102.103存储为数组{202,101,102,103}.假设用户的机器都直接和Internet连接,有独立的静态或动态IP.
编程要求:写一个程序,通过调用上面的CPPComm类来模拟P2P软件实现文件共享传输功能(提交共享、搜索文件、下载文件、查询对方资源情况)。可使用但不必编写文件信息索引服务器,只需定义数据和命令格式即可。参赛者主要任务是根据对方机器资源情况和文件存放位置来确定从哪些机器上下载或者自动分布到其他机器上。可以使用也可以不使用多线程。如果需要也可以使用CPPComm的派生类。程序的其他方面设计可以自由发挥。参赛的主题是算法的实现,对有关API不熟者可以使用定义了接口而未实现的类来代替。
欢迎大家讨论和参赛! |
|