Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1008147
  • 博文数量: 177
  • 博客积分: 3629
  • 博客等级: 中校
  • 技术积分: 1839
  • 用 户 组: 普通用户
  • 注册时间: 2005-02-23 21:21
文章分类

全部博文(177)

文章存档

2021年(1)

2020年(5)

2019年(4)

2018年(7)

2017年(1)

2016年(4)

2014年(1)

2013年(8)

2012年(10)

2011年(50)

2009年(12)

2008年(10)

2006年(56)

2005年(8)

分类: 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()循环

阅读(1801) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~