社区
C++ 语言
帖子详情
如何在windows环境下实现非阻塞单线程客户端编程
illuminati
2010-03-11 08:56:24
目前正在做网络爬虫,环境是windows下的,在抓取网页时打算选择非阻塞单线程的方式抓取网页,请问利用socket编程如何实现?
...全文
211
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
打赏
举报
回复
非阻塞模式下,通常需要提供一回调函数,当操作系统“告诉你你向系统请求的操作已经完成了”的方式就是调用你的回调函数。说简单点,就是你实现将我要如何处理事情的结果制定好,然后告诉系统,系统会在合适的时候执行。
JAVA_API1.6文档(中文)
定义了用于多路复用的、
非阻塞
I/O 操作的选择器。 java.nio.channels.spi 用于 java.nio.channels 包的服务提供者类。 java.nio.charset 定义用来在字节和 Unicode 字符之间转换的 charset、解码器和编码器。 ...
网络
编程
- 阻塞和
非阻塞
阻塞和
非阻塞
是对操作请求者在等待返回结果时的状态描述,阻塞时,在操作请求结果返回前,当前线程会被挂起,得到结果之后返回;
非阻塞
时,如果不能立刻得到结果,请求者不会挂起当前线程,而是直接返回错误信息,...
服务器模型——从
单线程
阻塞到多线程
非阻塞
(上)
该系列分成三部分:
单线程
/多线程阻塞I/O模型
单线程
非阻塞
I/O模型多线程
非阻塞
I/O模型,Reactor及其改进前言 这里探讨的服务器模型主要指的是服务器端对I/O的处理模型。从不同维度可以有不同的分类,这里从I/O的...
Qt:Qt
实现
Winsock网络
编程
—
非阻塞
模式下的简单远程控制的开发(WSAAsyncSelect)
Qt
实现
Winsock网络
编程
—
非阻塞
模式下的简单远程控制的开发(
单线程
) 前言 这边博客应该是 Qt
实现
Winsock网络
编程
—TCP服务端和
客户端
通信(多线程) 的姐妹篇,上篇博客中的socket通信中所用的
Windows
api函数 ...
Python编写基于socket的
非阻塞
多人聊天室程序(
单线程
&多线程)
前置知识:socket
非阻塞
函数(socket.setblocking(False))...1.
单线程
非阻塞
版本: 服务端: #!/usr/bin/env python # encoding: utf-8 import socket import os import sys import time import traceback
C++ 语言
64,654
社区成员
250,484
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章