社区
C++ 语言
帖子详情
如何在windows环境下实现非阻塞单线程客户端编程
illuminati
2010-03-11 08:56:24
目前正在做网络爬虫,环境是windows下的,在抓取网页时打算选择非阻塞单线程的方式抓取网页,请问利用socket编程如何实现?
...全文
235
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聊天室毕业设计完整版+数据库
7. **并发控制与同步**:在多线程
环境
下,为了保证数据的一致性和避免竞态条件,需要合理使用synchronized关键字、Lock接口以及并发容器。 8. **设计模式**:良好的软件设计通常会采用设计模式,如工厂模式用于创建...
Java.Concurrency.in.Practice.pdf
- **5.3 阻塞队列与生产者消费者模式**:阐述了阻塞队列的概念及其在
实现
生产者消费者模式中的作用。 - **5.4 阻塞和可中断方法**:讲解了如何处理阻塞方法和如何使这些方法支持中断。 - **5.5 同步器**:介绍了一些...
同时打开多端口的通信程序
- 为了
实现
实时并发处理多个
客户端
请求,程序可能采用多线程或者事件驱动模型,每个连接对应一个独立的线程或事件处理单元,这样可以在不阻塞主线程的情况下处理网络通信。 3. **服务端和
客户端
架构**: - 服务端...
c#100例
通过实例,可以了解如何使用Task和异步方法来
实现
非阻塞
操作。 8. **
Windows
Forms和WPF**:这两个是C#的UI开发框架,包含了大量的控件和事件处理。实例可能涵盖窗口应用的创建、用户交互和图形界面设计。 9. **...
网络
编程
- 阻塞和
非阻塞
阻塞和
非阻塞
是对操作请求者在等待返回结果时的状态描述,阻塞时,在操作请求结果返回前,当前线程会被挂起,得到结果之后返回;
非阻塞
时,如果不能立刻得到结果,请求者不会挂起当前线程,而是直接返回错误信息,...
C++ 语言
65,187
社区成员
250,526
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章