我正在尝试在服务器和客户端(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.
据我所知,此选项允许选择对等方的主地址(发送时),并要求对等方使用其中一个本地地址(接收时)。
问题是:有没有办法选择发送传出消息的本地地址?
选择接口对您有帮助吗?
你可以使用setsockopt来做到这一点:
struct ifreq ifr;
strncpy_IFNAMSIZ(ifr.ifr_name, "ethX");
setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, &ifr, sizeof(ifr));
免责声明:我没有使用lksctp的多路径或ASCONF,但我已经阅读了内核模块的源代码。
为每个对等地址构建一个单独的sctp_transport,因此这将取决于您的本地地址是多路径到一个远程地址,还是两个远程地址。
该关联保存接收到的数据包的目的地地址,以便在通过特定的sctp_transport发送时作为首选源重复使用。设置SCTP_SET_PEER_PRIMARY_ADDR将使对等端帮助您保留正确的本地地址作为特定传输的主地址,如果只有一个传输,则可能已经完成。如果存在多个传输,则可能会让对等方选择一个特定的传输。设置SCTP_PRIMARY_ADDR是另一种情况,如果有多个传输,它肯定会更新哪个传输是主要的。
对于多个传输,除非上层同意,否则不应该从"主"传输切换。然而,哪个传输是"活动的"取决于错误等,对于重传,规范明确鼓励使用备用传输地址。总的来说,我想说,在任何时候都试图控制哪种传输是活跃的(与主要的)是非常没有希望的。简单的事情,比如在对等启动之前发送INIT,会来回切换。
不要忽视这样一个事实,即如果您将/bindx绑定到特定地址(与0.0.0.0相比),它只会在您有绝对不想使用的地址的情况下使用这些地址。
祝你好运。
sctp_sendmessage具有此选项。http://linux.die.net/man/3/sctp_sendmsg[SCTP_SendMessage][1]