当前位置:  技术问答>linux和unix

求socket源码:一个最简单的下载工具

    来源: 互联网  发布时间:2015-11-10

    本文导语:  输入URL(如http://www.am621.com/media/gt/com/真的想你.rm)、保存路径和要保存的文件名,把文件下载下来 | prozilla, kget...很多都有源码的,自己找找 | 用socket实现 get一个文件的思...

输入URL(如http://www.am621.com/media/gt/com/真的想你.rm)、保存路径和要保存的文件名,把文件下载下来

|
prozilla, kget...很多都有源码的,自己找找

|
用socket实现 get一个文件的思路如下:

 1.) 用gethostbyname取得站点的IP地址。
 2.) 创建一个socket连接该站点的80端口。
 3.) 发送HTTP 的GET请求。
 4.) 读出server的response,去掉HTTP报头。
 5.) 将剩余内容写入文件。

  在windows用bsd socket实现的简单代码如下: (在linux上类似)
  //windows有个函数URLDownloadToFile可直接下面的功能实现,linux不知道有没有。
  //URLDownloadToFile(NULL,"http://www.baidu.com/img/logo.gif","c:\2.jpg",0,NULL);
/* testhttp.c */
#include 
#include 

#pragma comment(lib, "Ws2_32.lib")

int Send(SOCKET sd, char *fmt, ...);
int ReadEn(int  sock,struct timeval tv,int tryloop);
char *ParseHttpHead(char *buf);

int main(int argc, char **argv)
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

SOCKET sd;
struct sockaddr_in servaddr;

FILE *fp;

char buf[4096];

struct hostent *hostaddr;
char **h_addr_list;

wVersionRequested = MAKEWORD( 2, 2 );

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
printf("sock initialization errorn");
return -1;
}

if ( LOBYTE( wsaData.wVersion ) != 2 ||
        HIBYTE( wsaData.wVersion ) != 2 ) {
printf("Can not find a correct version socket versionn");
WSACleanup( );
return -1; 
}
//以上是windows socket的初始化
sd = socket (AF_INET, SOCK_STREAM, 0);

if ( sd == INVALID_SOCKET )
{
printf("socket() create error n errno = %d", WSAGetLastError());
return -1;
}

memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(80);
         
         //找到IP地址。
hostaddr = gethostbyname("www.baidu.com");
char **h_addr_list = hostaddr->h_addr_list;
if(*h_addr_list) {
servaddr.sin_addr.S_un.S_addr = ((struct in_addr*)h_addr_list[0])->S_un.S_addr;
}
else {
printf("can not resolve host addressn");
return -1;
}



if ( SOCKET_ERROR == connect(sd, (struct sockaddr *)&servaddr, sizeof(servaddr))) 
{
printf("connect error !n");
return -1;
}

         //发送HTTP GET请求
Send(sd, "GET http://www.baidu.com/img/logo.gif Http/1.0rn Accept:
www/source; text/html; image/gif; image/jpeg; */*rnrn");
memset(buf, 0, sizeof(buf));

fp = fopen("tmp.gif", "wb");
if (NULL == fp)
{
printf("fopen file errorn");
WSACleanup( );
return -1;
}

while(1)
{
int readlen = 0;
struct timeval tv;
char *contentptr;
int writelen;
tv.tv_sec = 10;
tv.tv_usec = 0;

                  //用select观察socket是否可读  
readlen = ReadEn(sd, tv ,20);

if (readlen 

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • JAVA网络编程(socket),用什么工具开发?怎么配置环境?
  • PHP的Socket工具包 nanoserv
  • libevent2需要从socket读一段数据写入一个socket中,同时发送给另一个socket iis7站长之家
  • 【百度分享】Socket通讯模块压力及大数据对比工具开发之aperlib(八)
  • 【百度分享】Socket通讯模块压力及大数据对比工具开发之aperlib(三)
  • 【百度分享】Socket通讯模块压力及大数据对比工具开发之aperlib(七)
  • 【百度分享】Socket通讯模块压力及大数据对比工具开发之aperlib(一)
  • java命名空间java.net类socket的类成员方法: socket定义及介绍
  • re socket编程中 ACCEPT返回的socket与原socket(他参数中的)端口号一样吗?
  • java命名空间java.nio.channels类socketchannel的类成员方法: socket定义及介绍
  • libevent2需要从socket读一段数据写入一个socket中,同时发送给另一个socket
  • java命名空间java.nio.channels类serversocketchannel的类成员方法: socket定义及介绍
  • socket 通讯开发包 Simple Sockets
  • java命名空间java.nio.channels类datagramchannel的类成员方法: socket定义及介绍
  • C++ Socket 库 C++ Sockets
  • java命名空间java.net类socket的类成员方法: getsendbuffersize定义及介绍
  • vc做的的socket应用和unix下socket?
  • java命名空间java.net类socket的类成员方法: getreceivebuffersize定义及介绍
  • QSocketDevice ( int socket, Type type )中那个 int socket 是哪里来得?
  • java命名空间java.net类socket的类成员方法: gettrafficclass定义及介绍
  • socket编程 通过man socket, 没有找到socket函数的第一参数该填什么 怎样利用man手册
  • java命名空间java.net类socket的类成员方法: getport定义及介绍
  • 线程间可否通过管道传递SOCKET句柄?还有其他方式传递SOCKET么?
  • java命名空间java.net类socket的类成员方法: getlocalport定义及介绍
  • [FreeBSD] 大神,求解,control socket : can‘t to any socket
  • java命名空间java.net类socket的类成员方法: getinetaddress定义及介绍
  • 两个 Socket 互相通信,其中一个如何判断另一个 Socket 是否已经意外断开了连接?
  • java命名空间java.net类socket的类成员方法: isconnected定义及介绍
  • 大家帮忙推荐一本linux socket编程的入门书,我刚接触socket,谢谢!!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3