C++ IPv4和IPv6之间的混合模式通信

C++ IPv4和IPv6之间的混合模式通信,c++,sockets,ipv6,gsoap,C++,Sockets,Ipv6,Gsoap,我有一个同时充当客户机和服务器的应用程序。作为服务器,它在端口xxxx[代理URL]上接受SOAP请求,并在端口yyyy[通知URL]上向发送方发送通知 因此,基本上它在端口xxxx上充当服务器,在端口yyyy上充当客户端。我的服务具有专用IP IPv6或IPv4 我们正在使用GSOAP进行通信,并重写GSOAP函数tcp_connect()进行客户端绑定 目前,我面临着向IPv6过渡服务的问题。用例:当我监听IPv6地址时,我的通知URL是IPv4 从GSOAP实现中,根据通知URL创建套接字

我有一个同时充当客户机和服务器的应用程序。作为服务器,它在端口xxxx[代理URL]上接受SOAP请求,并在端口yyyy[通知URL]上向发送方发送通知

因此,基本上它在端口xxxx上充当服务器,在端口yyyy上充当客户端。我的服务具有专用IP IPv6或IPv4

我们正在使用GSOAP进行通信,并重写GSOAP函数tcp_connect()进行客户端绑定

目前,我面临着向IPv6过渡服务的问题。用例:当我监听IPv6地址时,我的通知URL是IPv4

从GSOAP实现中,根据通知URL创建套接字

sk = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
现在,我们尝试相应地绑定到此套接字(IPv4或IPv6):

由于已创建套接字(根据通知URL的类型),因此如果套接字的类型不匹配,则绑定将失败


当套接字系列和代理ip地址属于不同的系列时,如何使客户端绑定工作?

可能我没有理解您正在尝试的内容,或者您对TCP/ip和RPC的正常工作方式有一些误解

让我解释一下你的设置,然后展示一下我认为奇怪的地方

您有一个服务器和一个或多个客户端。服务器在固定端口(比如1337)上接受IPv4和IPV6连接。要回答这个请求,您需要在另一个固定端口(比如1338)上打开一个新的TCP流(或者SOAP)。您现在想知道为什么,当第二个客户端将绑定连接到1338失败时

简短的回答是:“港口正在使用中,嗯,我们是另一个港口!”

但至少可以说,这忽略了设置的要点。虽然我从来没有使用过GSOAP,但我使用过SOAP和其他RPC框架,而且您概述的内容很奇怪,除非我遗漏了您没有概述的内容

第一件很奇怪的事情是,如果您需要SOAP请求的答案,为什么您要简单地用返回值来制定一个答案?调用SOAP函数,客户端将阻塞,直到得到响应为止。如果您不想让调用在相对较长的调用持续时间内阻塞,请异步执行整个过程

那么您想稍后将数据传递回客户端?这里有两种解决方案,一种是客户端轮询服务器,另一种是打开到客户端的新SOAP连接。第一种解决方案基本上是可取的,因为在大多数情况下,客户机可以连接到服务器,但不能反过来连接。例如,客户机可能在NAT后面,您现在做什么?当您知道客户机总是可以访问时,第二种解决方案可以很好地工作

在我看来,您正在尝试第二个“返回通道”解决方案。在这种情况下,为什么要绑定到端口?任何IP连接的客户端都不需要绑定到端口。操作系统将自动分配一个可用端口。然后,您需要做的是将客户端上的端口绑定到一个已知的IP。然后使用这个众所周知的客户端端口,并在服务器上的
connect
中使用它(或者不使用,因为您使用的是SOAP)

由于这一切都令人困惑,让我用一个小图表来说明这一点:

                   Client                   Server
                   ------                   ------
Request Channel    <random port>            1337
Back Channel       1338                     <random port>
客户端服务器
------                   ------
请求频道1337
后频道1338
总而言之:


因此,要么你正在重新实现在SOAP中工作的东西,应该停止这样做,要么如果你确实需要一个反向通道,干脆不要在客户端套接字上调用bind

我知道这不是一个解决方案,但我的第一个想法是“将应用程序拆分为单独的客户端和服务器部分,每个部分可以独立为IPv4或IPv6,并使用某种IPC将它们链接起来“看起来您必须创建两个独立的套接字。这不可能吗?第三种解决方案是让客户端长时间轮询进程。@Calvin确认这一点。虽然我没有提到轮询间隔或持续时间,但值得一提的是,这些情况对我来说是不可能的,因为架构是固定的,并且在仅使用IPv4或IPv6时工作良好。谢谢,但是我还是不明白为什么要绑定服务器上的传出套接字。这可能是拼图中缺失的部分吗?
                   Client                   Server
                   ------                   ------
Request Channel    <random port>            1337
Back Channel       1338                     <random port>