随笔分类 -  socket

摘要:貌似以前使用过cUrl,不过没读过源码,记得以前到是看过wGet的源码,不过那个程序是单线程的。这次无意中发现cUrl的源码居然有Windows版的,到http://curl.haxx.se/下了个最新版的源码下来,源码是用VC6编译的,我在VS2005下重新进行编译,居然只有一个警告。cUrl的实现代码是放在动态库中,将动态库以静态方式编译生成libcurl.lib,然后将cUrl源码目录下的“include/curl”文件夹复制到自己的项目下(如图1)。图1接下来就可以直接调用curl库了,下面是一个网上找来的简单例子:#include "curl/curl.h"#pr 阅读全文
posted @ 2011-04-12 05:59 冷寒生 阅读(4921) 评论(0) 推荐(0)
摘要:09年我在这个问题上折腾了大半年,还因此写了篇博文[这下该不会阻塞了吧],最初的是想实现多线程下载网页源码,但经过对HTTP协议的学习,发现只有支持断点继传的网站才用得上多线程下载,因此又把需求放在批量快速下载网页源码上,比如我同时需要访问100个网页,如果用IdHttp就头大了,Idhttp就连访问302页面也会出现异常,调试起来很麻烦。而用自己写的TWinHttp类,recv函数阻塞的问题是能解决了,但如果短时间频繁的获取网页源码,50%以上的访问都会出现connect失败和recv超时,以前很难解决的问题,这次却让我想到了一个较好的解决办法。首先,对于connect,如果连接失败就进入死 阅读全文
posted @ 2011-04-08 05:13 冷寒生 阅读(911) 评论(0) 推荐(0)
摘要:以前关注过在socket使用http代理访问网页的问题,原理很简单,就是非代理情况下connect的是目标网页的IP和端口,而使用代理则connect代理IP和端口,连接成功后就直接send数据了。原理清楚,但一直没应用过,今天正好需要就测试了一下,结果在http代理可用,connect正常的情况下,send数据后总是返回http/1.1 400。最后在一个帖子中找到了原因所在,其实使用http代理来发送GET或POST,其包的格式与非代理的GET或POST有一些区别,区别共有两处:1.发送的包中可以不加Host ( Host: www.baidu.com )2.在GET的路径中设置访问页面的 阅读全文
posted @ 2011-03-29 05:35 冷寒生 阅读(2150) 评论(0) 推荐(0)
摘要:socket编程阻塞的问题搞了我几个月,这段时间实在是太漫长了,其实我只是需要一个很简单的函数,那就是获取网页源码,就是一个这么简单的需要,我搞了几个月。最初我把所有的socket函数放入一个线程,在线程中设置超时时间,但这样会遇到一个问题,如果线程的超时时间设为30秒,30秒没接收完成就表达失败,但在正常情况下网页文件在30秒内也有可能接收不完,所以这个方法宣告失效。接着又找了个Linux下的多线程下载软件,研究了一下代码,写了个多线程的网页文件下载,这又把问题弄得更复杂了,可能是我的代码没控制好,程序虽然不会阻塞了,但下载的网页源码偶尔会不完整,遇到这个问题又拖了我几个月。几个月后开始用. 阅读全文
posted @ 2009-11-04 04:53 冷寒生 阅读(365) 评论(0) 推荐(0)
摘要:各个线程任务分配是这样实现的。在开始下载时,文件平均分成若干块进行下载。如第一个线程一开始的任务是从文件的0位置开始下载一直到72908位置处。线程1每次下载一块数据后就要调整任务,如第一次下载了20800字节的数据,那么线程1的任务将改为:20800-72908。如此下去,直到任务为72908-72908时表示线程1完成了当前的下载任务。此时,线程1就分析各个线程的任务,找出任务最为繁忙的一个线程:如线程3:14816-218724。那么线程1就自动去调整任务,拿50%的任务来再次下载。周而复始直到各个线程都完成任务。不过这里有一点需要注意:为了避免重复下载部分数据,在调整任务的时候,起始的 阅读全文
posted @ 2009-06-17 23:04 冷寒生 阅读(1227) 评论(0) 推荐(0)
摘要:下载源代码 从HTTP服务器上下载一个文件有很多方法,“热心”的微软提供了 WinInet 类,用起来也很方便。当然,我们也可以自己实现这些功能,通过格式化请求头很容易就能实现断点续传和检查更新等等功能 。本文附带的工程中有一个支持 HTTP1.1 协议,直接用 Socket 实现下载功能的 DLL,实现了以下功能:连接主机格式化请求头设置接收,发送超时接收并分析回应头连接,发送,设置超时,接收数据等我就不细说了,windows socket早就做好了,调用相应的函数就OK了。 要想从服务器下载文件,首先要向服务器发送一个请求。HTTP 请求头由若干行字符串组成。下面结合实例说说 HTTP 请 阅读全文
posted @ 2009-02-27 17:06 冷寒生 阅读(443) 评论(0) 推荐(0)
摘要:#include <stdio.h> #include <winsock.h> #include <string.h> #include <Windows.h>#pragma comment(lib, "ws2_32.lib") #define TIME_OUT_TIME 20 //connect超时时间20秒void geturl(char *url) { WSADATA WSAData={0}; SOCKET sockfd; struct sockaddr_in addr; struct hostent *pURL; ch 阅读全文
posted @ 2009-02-25 16:27 冷寒生 阅读(10420) 评论(0) 推荐(0)
摘要:极其常用的Ping命令通过向计算机发送ICMP Echo请求报文并且监听回应报文的返回,以校验与远程计算机或本地计算机的连接。 使用ICMP.DLL实现Ping 在Windows平台编程中实现Ping的一个最简单方法是调用ICMP.DLL这个动态链接库,引用ICMP.DLL中的三个函数即可:HANDLE IcmpCreateFile(void); 这个函数打开个ICMP Echo请求能使用的句柄;BOOL IcmpCloseHandle(HANDLE IcmpHandle); 这个函数关闭由IcmpCreateFile打开的句柄;DWORD IcmpSendEcho( HANDLE IcmpH 阅读全文
posted @ 2008-12-16 17:37 冷寒生 阅读(482) 评论(0) 推荐(0)
摘要:不知不觉,三天的时间又过去了。这三天只做了一件事,那就是解决用socket下载图片并显示的问题。最初连怎么在SDK显示JPG/GIF图片的方法也不知道,只有不停的百度,不停的Google,本来以为这个问题比前两天MD5的问题简单,因为网上应该有现成的资料,但却硬是花了我整整三天的时间。不知是我找资料的能力有问题,还是基础知识实在太差,MSDN的强大功能又基本不会用。本来连我自己都认为这是一个简单的问题,用socket下载图片很简单,发送一个报文然后用recv函数就能接收图片数据了,问题的关键是我不知道怎么将接收的图片数据显示出来。今天晚上终于把这个问题解决了,其实真的很简单,关键代码还不到10 阅读全文
posted @ 2008-11-28 00:20 冷寒生 阅读(654) 评论(0) 推荐(0)
摘要:服务器端源码:#include<winsock2.h> #include<stdio.h> #include<iostream> #pragmacomment(lib,"ws2_32.lib") intmain(void){WORDwVer;WSADATAwsaData;interr;wVer=MAKEWORD(2,1);err=WSAStartup(wVer,&wsaData);if(err!=0){return0;}SOCKETsocketServ=socket(AF_INET,SOCK_STREAM,0);SOCKADDR_ 阅读全文
posted @ 2008-10-28 00:51 冷寒生 阅读(351) 评论(0) 推荐(0)
摘要:平常我们要访问某个URL一般都是通过浏览器进行:提交一个URL请求后,浏览器将请求发向目标服务器或者代理服务器,目标服务器或者代理服务器返回我们所需要的数据,浏览器接收到这些数据后保存成文件并进行显示。下面我们看看如何自己利用winsock2.h中的接口来实现这个功能?为了简化问题,作以下假设:通过代理服务器进行HTTP访问,这样就省去了对URL进行DNS解析的步骤,假设代理服务器的地址为:192.168.0.1:808。这个功能由以下几个部分组成:1. 如何建立连接?2. 如何发送请求?3. 如何接收数据?4. 如何判断数据接收完成?下面我们依次来看下这些问题如何解决?一、如何建立与服务器之 阅读全文
posted @ 2008-10-28 00:31 冷寒生 阅读(471) 评论(0) 推荐(0)
摘要:学C++之前,就想用C++写一个网络软件,到达目的地的路很多,但我选择了学C++来达到我的目的。虽然用VB或Delphi来写我的这个网络软件,会更快更便捷,不过我还是选择了C++。走上C++之路,要想写一个Windows下的软件,要学的实在太多了。首先要学SDK,学会用API函数来写软件的界面,但学SDK要有C语言的基础,如果C语言基础不好,还得返回去恶补C语言基础。学了SDK,虽然能写Windows界面软件,但制作流程太复杂,想要省事儿还得学MFC……总之,这是一个漫长的过程。用C++写网络程序,以前想都没想过,认为只用C++既不能写Windows界面,也没有网络控件可用。说来惭愧,小弟我接 阅读全文
posted @ 2008-10-27 01:45 冷寒生 阅读(298) 评论(0) 推荐(0)

IT知识库