如何在windows环境下实现非阻塞单线程客户端编程

illuminati 2010-03-11 08:56:24
目前正在做网络爬虫,环境是windows下的,在抓取网页时打算选择非阻塞单线程的方式抓取网页,请问利用socket编程如何实现?
...全文
211 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
cattycat 2010-03-13
  • 打赏
  • 举报
回复
code blocks编译可能需要配置链接dll吧。google一下如果配置环境吧。
macrojj 2010-03-13
  • 打赏
  • 举报
回复
LZ 你下的是Windows的,在Liunx下编 行不行啊。。。
illuminati 2010-03-12
  • 打赏
  • 举报
回复
这是我在网上下的非阻塞连接的代码,但是连接时说函数没定义,我的编译环境是code::blocks gcc编译器,请问还需加什么头文件么?
#include <winsock.h>
#include <stdio.h>
#include <conio.h>
#include <sys/types.h>
#include <sys/timeb.h>
#include <iostream>
#pragma comment(lib, "ws2_32")
using namespace std;
int main()
{
WSADATA wsd;
SOCKET cClient;
string url = "www.sina.com.cn";
int send_time = 6000;
int recv_time = 6000;
int ret;
struct sockaddr_in server;
hostent *host=NULL;
if(WSAStartup(MAKEWORD(2,0),&wsd))
{
cerr<<"WSAStartup error";
return 0;
}
cClient=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if (cClient==INVALID_SOCKET)
{
cerr<<"socket error";
return 0;
}
//set Recv and Send time out
if (::setsockopt(cClient,SOL_SOCKET,SO_SNDTIMEO,(char *)&send_time,sizeof(send_time))==SOCKET_ERROR)
{
cerr<<"setsockopt error";
return 0;
}

if (::setsockopt(cClient,SOL_SOCKET,SO_RCVTIMEO,(char *)&recv_time,sizeof(recv_time))==SOCKET_ERROR)
{
cerr<<"setsockopt error";
return 0;
}

//设置非阻塞方式连接
unsigned long ul = 1;
ret = ioctlsocket(cClient, FIONBIO, (unsigned long*)&ul);
if (ret==SOCKET_ERROR)return -1;
//连接
if ((host = gethostbyname(url.c_str())) == NULL)
{
cout<<"gethostbyname error";
exit(-1);
}
server.sin_family = AF_INET;
memcpy(&server.sin_addr,host->h_addr,host->h_length);
printf("%s",inet_ntoa(server.sin_addr));
connect(cClient,(const struct sockaddr *)&server,sizeof(server));
//select 模型,即设置超时
struct timeval timeout ;
fd_set r;
FD_ZERO(&r);
FD_SET(cClient, &r);
timeout.tv_sec = 15; //连接超时15秒
timeout.tv_usec =0;
ret = select(0, 0, &r, 0, &timeout);
if ( ret <= 0 )
{
::closesocket(cClient);

return 0;
}

//一般非锁定模式套接比较难控制,可以根据实际情况考虑 再设回阻塞模式
unsigned long ul1= 0 ;
ret = ioctlsocket(cClient, FIONBIO, (unsigned long*)&ul1);
if (ret==SOCKET_ERROR)
{
::closesocket (cClient);
return 0;
}
}
macrojj 2010-03-12
  • 打赏
  • 举报
回复
[Quote=引用楼主 wsllittlebird 的回复:]
目前正在做网络爬虫,环境是windows下的,在抓取网页时打算选择非阻塞单线程的方式抓取网页,请问利用socket编程如何实现?
[/Quote]
很多方式。 看看socket的五种模式吧。
shiweifu 2010-03-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 canyingwushang 的回复:]

非阻塞模式下,通常需要提供一回调函数,当操作系统“告诉你你向系统请求的操作已经完成了”的方式就是调用你的回调函数。说简单点,就是你实现将我要如何处理事情的结果制定好,然后告诉系统,系统会在合适的时候执行。
[/Quote]

一语道破
canyingwushang 2010-03-12
  • 打赏
  • 举报
回复
非阻塞模式下,通常需要提供一回调函数,当操作系统“告诉你你向系统请求的操作已经完成了”的方式就是调用你的回调函数。说简单点,就是你实现将我要如何处理事情的结果制定好,然后告诉系统,系统会在合适的时候执行。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧