开始使用boost::asio库时,编译碰到这个错误提示:
fatal error C1189: #error : WinSock.h has already been included
查了下抛出这个错误的boost代码,原来是定义了_WINSOCKAPI_,但没有定义_WINSOCK2API_
那哪里定义了_WINSOCKAPI_呢?
后来在网上查了下,原来是我包含了Windows.h头文件,而Windows.h头文件又包含了WinSock.h这个老东西
知道原因就简单了,试了下,方法有三种可解决此错误:
1、在包含Windows.h前定义宏WIN32_LEAN_AND_MEAN,就OK了(WIN32_LEAN_AND_MEAN表示不包含一些极少使用和偏门的资料)
2、在包含Windows.h前包含winsock2.h
3、在包含Windows.h前包含asio.hpp
<br />开始使用boost::asio库时,编译碰到这个错误提示:<br />fatal error C1189: #error : WinSock.h has already been included<br />查了下抛出这个错误的boost代码,原来是定义了_WINSOCKAPI_,但没有定义_WINSOCK2API_<br />那哪里定义了_WINSOCKAPI_呢?<br />后来在网上查了下,原来是我包含了Windows.h头文件,而Windows.h头文件又包含了WinSock.h这个老
#
include
#
include
编译器会报错,fatal error C1189: #error :
WinSock
.h has already been
include
d
解决
办法
#defin
虽然我的情况和上面不太一样,但问题的原因是一样的:
就是有一个包含#
include
<
boost
/
asio
.hpp>的头文件A.h,和一个包含
windows
.h的头文件B.h。而B.h在main.cpp的顺序在A.h之前。
调整头文件顺序就好了~
最近在做一项目,使用QT+
boost
asio
,编译时出现编译错误:
WinSock
.h has already been
include
d,只要把
boost
asio
库的包含文件放到QT包含文件之前即可,如原先包含顺序:
#
include
#
include
#
include
即可
解决
问题。
`
boost
::
asio
::io_service`是
Boost
库中的一个核心类,用于提供异步I/O操作的事件循环机制。它是实现异步网络编程的基础,可用于处理各种网络通信任务。
`
boost
::
asio
::io_service`的主要作用是管理和调度异步操作。它负责处理事件循环,监视和分发I/O事件,以及执行注册的回调函数。通过使用`io_service`对象,可以实现非阻塞式的异步I/O编程,提高程序的并发性和响应性。
以下是`
boost
::
asio
::io_service`类的常见用法示例:
```cpp
#
include
<
boost
/
asio
.hpp>
void handleRead(const
boost
::system::error_code& error, std::size_t bytes_transferred) {
if (!error) {
// 处理读取数据的回调逻辑
} else {
// 处理错误情况
int main() {
boost
::
asio
::io_service io_service;
// 创建一个socket对象
boost
::
asio
::ip::tcp::socket socket(io_service);
// 连接到服务器
socket.connect(endpoint);
// 异步读取数据
boost
::
asio
::async_read(socket,
boost
::
asio
::buffer(buffer), handleRead);
// 开始事件循环
io_service.run();
return 0;
在上述示例中,首先创建了一个`io_service`对象,然后创建了一个TCP socket对象,并使用`io_service`对象进行异步读取操作。在`async_read`函数中,指定了一个回调函数`handleRead`,用于处理读取数据完成后的回调逻辑。
最后,通过调用`io_service`的`run()`函数启动事件循环,使程序进入等待事件的状态。在事件循环中,`io_service`会不断地监视和分发I/O事件,并执行注册的回调函数。
使用`
boost
::
asio
::io_service`,可以方便地实现异步的网络编程,处理各种I/O操作,如读取、写入、连接、接收等。它提供了高度灵活和可扩展的方式来构建异步应用程序。