分类: C/C++
2006-04-06 22:44:44
这个网址提供了一个Sockets库可以更方便地使用Socket,可以多平台使用,不过资料奇少,英文的也少,网站上提供的例子在新版本上已经不适用. 今天试了一下,写了个下载的小例子,可以编译并下载一个zip文件.
/* 示例类: TcpSocket 使用的是http下载
关键字: 回调函数使用,下载文本文件,二进制文件.
缺点:只能一次下载完.出现任何错误都得重新下载.
提示:改地址,和去掉ios::binary可以下载网页
新加: Socket库需要openssl,stlport,如没安装者不要尝试编译.
编译环境: stlport4.5.3 openssl0.9.8a Sockets库2.0.2b VC6的link,intel的编译器,呵呵多吧 */
#include
#include
#include
#include
#include
using namespace std;
class mysocket : public TcpSocket //HttpGetSocket
{
public:
mysocket(SocketHandler &h): first(true),TcpSocket(h) {}
~mysocket(){}
void OnRead();
void OnWrite();
void OnRawData(const char *,size_t);
void OnConnect();
void SetData(char *buf,size_t len);
private:
char *m_buf;
size_t m_len;
bool first;
};
void mysocket::OnRawData(const char *buf,size_t len)
{
//当成功接收到数据后才会调用此函数,接收即可
const char *pbody=buf;
int body=len;
if(first){
pbody=strstr(buf,"\r\n\r\n");
pbody+=4;
body=len-abs(pbody-buf);
first=false;
}
ofstream o("xxx.zip",ios::out|ios::binary|ios::app);
string r(pbody,body);
o<
void mysocket::OnRead()
{
//OnRead最终会调用OnRawData不知在这儿做什么?不如在OnRawData中处理数据.
TcpSocket::OnRead();
}
void mysocket::OnWrite()
{
//已被TcpSocket重载,会把obuf里的数据发出去
TcpSocket::OnWrite();
}
void mysocket::OnConnect()
{
//在一个成功的connect之后会调用此回调函数,只需发送即可,其实是保存到obuf里面去了
SendBuf(m_buf,m_len);
}
void mysocket::SetData(char *buf,size_t len)
{
m_buf=buf;
m_len=len;
}
int main(int argc,char *argv[])
{
SocketHandler h;
mysocket mydd(h);
char sended[]="GET /sourceforge/httputils/http_utils-0.4.0.zip HTTP/1.1\r\nHOST: umn.dl.sourceforge.net\r\n\r\n";
mydd.SetData(sended,sizeof(sended));
mydd.Open("umn.dl.sourceforge.net",80);
h.Add(&mydd);
h.Select(1,0);
while(h.GetCount())
{
h.Select(1,0);
}
}
总结一下使用方法:
1创建一个类,可以从TcpSocket类继承
2 重载相应的虚函数
3 创建SocketHandler实例,创建新类实例.并初始化.
4 调用 SocketHandler.Add(Socket *)
5 建立Select()循环