我试图在服务器和客户端(Linux)之间设置SCTP连接。服务器有多个IP地址,并且根据源地址路由传出的ip数据包。我希望sctp连接默认使用某个地址(默认情况下使用某个路由)
我找到的唯一选择是:
SCTP_SET_PEER_PRIMARY_ADDR
Requests that the peer mark the enclosed address as the association primary. The enclosed address must be one of the association's locally bound addresses. The struc‐
ture sctp_setpeerprim defined in /usr/include/netinet/sctp.h is used to make a set peer primary request.
SCTP_PRIMARY_ADDR
Requests that the local SCTP stack use the enclosed peer address as the association primary. The enclosed address must be one of the association peer's addresses. The
structure sctp_prim defined in /usr/include/netinet/sctp.h is used to make a get/set primary request.
据我了解,此选项允许选择对等方的主要地址(发送时)并要求对等方使用其中一个本地地址(接收时)。
问题是:有没有办法选择发送外发邮件的本地地址?
答案 0 :(得分:0)
选择界面,对你有帮助吗?
你可以使用setsockopt来做到这一点:
struct ifreq ifr;
strncpy_IFNAMSIZ(ifr.ifr_name, "ethX");
setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, &ifr, sizeof(ifr));
答案 1 :(得分:0)
免责声明:我没有使用lksctp的multipath或ASCONF,但我已经阅读了内核模块源代码。
为每个对等地址构建一个单独的sctp_transport,因此事情将取决于您的本地地址是否被多路径到一个远程地址或两个。
该关联保存接收到的数据包的目标地址,以便在通过特定sctp_transport发送时重新用作首选源。设置SCTP_SET_PEER_PRIMARY_ADDR会使对等方帮助您将正确的本地地址保留为特定传输的主要地址,如果只有一个传输,则可能已完成。如果有多个传输,则可能使对等方选择一个特定的传输。设置SCTP_PRIMARY_ADDR是一个翻转案例,如果有多个传输,它肯定会更新哪个传输是主要的。
对于多个传输,除非上层说明,否则不应该远离“主要”传输。但是,哪个传输是“活动的”取决于错误等,并且对于重传,规范明确鼓励使用备用传输地址。总的来说,我会说,在任何时候都试图控制哪个传输是活动的(vs primary)是没有希望的。在对等体启动之前发送INIT等简单的事情将来回切换。
不要忽视这样一个事实:如果你将/ bindx绑定到特定的地址(vs 0.0.0.0),它只会使用那些,如果你有地址你绝对不想使用它。
祝你好运。
答案 2 :(得分:0)
sctp_sendmessage有选项。 http://linux.die.net/man/3/sctp_sendmsg [SCTP_SendMessage] [1]