社区
C++ 语言
帖子详情
如何在windows环境下实现非阻塞单线程客户端编程
illuminati
2010-03-11 08:56:24
目前正在做网络爬虫,环境是windows下的,在抓取网页时打算选择非阻塞单线程的方式抓取网页,请问利用socket编程如何实现?
...全文
295
6
打赏
收藏
如何在windows环境下实现非阻塞单线程客户端编程
目前正在做网络爬虫,环境是windows下的,在抓取网页时打算选择非阻塞单线程的方式抓取网页,请问利用socket编程如何实现?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
打赏
举报
回复
非阻塞模式下,通常需要提供一回调函数,当操作系统“告诉你你向系统请求的操作已经完成了”的方式就是调用你的回调函数。说简单点,就是你实现将我要如何处理事情的结果制定好,然后告诉系统,系统会在合适的时候执行。
Reactor 模式全解:
实现
非阻塞
I/O 多路复用
我们还是先使用文字拆解来看看每个词是什么意思吧。好了,有了以上的背景或许你已经对I/O多路复用有了自己的理解和定义。这儿我根据自己的理解来对I/O多路复用进行定义:I/O多路复用就是使用一个或者几个进程或者线程来完成大量通道或者数据源的事件监控和处理。
非阻塞
I/O是相对于阻塞I/O而言的,它们之间的区别就是你进行I/O操作时是否阻塞你后续的执行。
非阻塞
不会阻塞后续执行,而阻塞会。这就好比:你用某App网上下单到店取一样。假设你直接到店里面用手机下单,你必须在店里等待食物准备好。
Redis到底是多线程还是
单线程
?
网上很多人认为Redis是
单线程
,但是根据其这么高的效率,然后用
windows
运行时查看任务管理器发现好像不止一个线程,所以求大神指点确认回答一下。 关注者 8 被浏览 3841 关注问题写回答 添加评论 分享 邀请回答
阻塞和
非阻塞
在
Windows
下的 socket
编程
有两个
编程
模型,阻塞和
非阻塞
。有时,他们也被叫做同步(阻 塞)和异步(
非阻塞
)。 在 Unix 中只支持阻塞模型。 实际上还 有些 其他的 已经实 现的模 型。 包括完 成端口 (completion ports), 和重叠 I/O(overlapped I/O) 。然而使用这些模型要用明显更多的代码并且它们是特别为高级服务器 应用保留的。 还有,...
利用 libssh2
实现
高效
非阻塞
SSH 连接
本文详细介绍了如何利用libssh2库
实现
高效的
非阻塞
SSH连接,适用于服务器批量运维、物联网设备管理等场景。通过事件循环机制和关键状态管理,开发者可以构建高并发的SSH
客户端
,显著提升运维效率。文章还提供了实战代码示例、性能优化技巧和安全增强建议,帮助读者快速掌握
非阻塞
SSH连接的核心技术。
C++ 语言
65,211
社区成员
250,514
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章