[英]C++ Boost.ASIO: passing accepted TCP connection from one opened socket to another using Windows APIs ( while works with Linux APIs)?
我正在尝试学习如何使用Boost.ASIO和Windows API重新分配接受的连接。 发现添加到其中的此代码示例包括并使用了名称空间,因此现在可以编译-只需复制和粘贴,即可开始使用...“参数不正确”异常在同一位置的代码发布者具有它=(所以这里是代码:
#include <iostream>
#include <boost/asio.hpp>
#ifdef _WIN32
#include "Windows.h"
#endif
using namespace boost::asio::ip;
using namespace std;
int main(){
int m_nPort = 12345;
boost::asio::io_service io_service;
tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), m_nPort));
cout << "Waiting for connection..." << endl;
tcp::socket socket(io_service);
acceptor.accept(socket);
cout << "connection accepted" << endl;
#ifdef _WIN32
WSAPROTOCOL_INFO pi;
WSADuplicateSocket(socket.native(), GetCurrentProcessId(), &pi);
SOCKET socketDup = WSASocket(pi.iAddressFamily/*AF_INET*/, pi.iSocketType/*SOCK_STREAM*/,
pi.iProtocol/*IPPROTO_TCP*/, &pi, 0, 0);
char sText[] = "I can use my duplicated socket via WinApi!\r\n";
int nRet = send(socketDup, sText, strlen(sText), 0);
#else
//linux
int socketDup = dup(socket.native()); // tested on Linux, works!
#endif
try
{
tcp::socket s(io_service);
s.assign(tcp::v4(), socketDup); //this throws exception under Windows
//I can't use my socket via boost lib
s.send(boost::asio::buffer("Not work\r\n"));
cout << "We do not get here!=(" << endl;
}
catch(exception &e)
{
cerr << e.what() << endl; //"The parameter is incorrect" exception
}
cin.get();
}
一般来说, 这篇文章后面的代码 ,但实际上我看不出有什么问题,也没有找到解决方法。
它遵循以下方式:如何将接受的TCP连接从一个进程传递到另一个进程( 在此处描述 )
可能是这个“在不同Windows平台上的套接字继承”示例可能有帮助,但我不知道如何。
任何人都可以帮助我找到该问题的任何可能的解决方法吗?
更新:刚刚在Linux上测试过的代码-完美运行,没有错误。
那么Windows版本是什么呢?
尝试使用
WSASocket
文档附带的代码段:
socketDup = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO, &pi, 0, WSA_FLAG_OVERLAPPED);
好的,我跟踪了Boost代码,但是尝试将套接字与I / O完成端口关联失败。 这是因为套接字已经与完成端口关联。
MSDN文档说:
最好不要通过句柄继承或对DuplicateHandle函数的调用来共享与I / O完成端口关联的文件句柄。 使用此类重复句柄执行的操作将生成完成通知。 建议仔细考虑。
知道IOCP与问题有关,我进行了设置(在包含所有boost头之前)
#define BOOST_ASIO_DISABLE_IOCP 1
一切正常。
本地输出:
Waiting for connection...
connection accepted
We do not get here!=(
远程输出:
I can use my duplicated socket via WinApi!
Not work
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.