社区
C++ 语言
帖子详情
如何在windows环境下实现非阻塞单线程客户端编程
illuminati
2010-03-11 08:56:24
目前正在做网络爬虫,环境是windows下的,在抓取网页时打算选择非阻塞单线程的方式抓取网页,请问利用socket编程如何实现?
...全文
236
6
打赏
收藏
如何在windows环境下实现非阻塞单线程客户端编程
目前正在做网络爬虫,环境是windows下的,在抓取网页时打算选择非阻塞单线程的方式抓取网页,请问利用socket编程如何实现?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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
打赏
举报
回复
非阻塞模式下,通常需要提供一回调函数,当操作系统“告诉你你向系统请求的操作已经完成了”的方式就是调用你的回调函数。说简单点,就是你实现将我要如何处理事情的结果制定好,然后告诉系统,系统会在合适的时候执行。
Java聊天室毕业设计完整版+数据库
一个Java的程序设计 聊天室毕业设计 完整代码+数据库
Java.Concurrency.in.Practice.pdf
Java.Concurrency.in.Practice.pdf
同时打开多端口的通信程序
采用Socket通讯协议进行 一个可以同时打开多端口
客户端
及服务端通信的 自定义命令解析试验程序。 里面抱含了一个原生数据库ADO操作类,初数sockt及ADO数据库操作者很值得一看。
c#100例
这个是c#实例,对初学c#的朋友们是很有用处的……
网络
编程
- 阻塞和
非阻塞
说明 网络
编程
中有两种模式:阻塞和
非阻塞
,默认是采用阻塞方式。 什么是阻塞和
非阻塞
阻塞和
非阻塞
是对操作请求者在等待返回结果时的状态描述,阻塞时,在操作请求结果返回前,当前线程会被挂起,得到结果之后返回;
非阻塞
时,如果不能立刻得到结果,请求者不会挂起当前线程,而是直接返回错误信息,因此对应
非阻塞
的情况,调用者需要定时轮询查看处理状态。 本质:阻塞和
非阻塞
本质上是本地系统对socket的不同处理方式,并不影响socket链接,也不会影响通信对方,通信双方可以自由选择阻塞还是
非阻塞
,例如:
客户端
设置成阻塞
C++ 语言
65,187
社区成员
250,526
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章