首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >缺少IPv4地址参数

问缺少IPv4地址参数
EN

Stack Overflow用户
提问于 2018-09-13 01:49:10
回答 1查看 1.1K关注 0票数 2

我一直在Java + lksctp上测试SCTP支持。我编写了一个简单的客户机,以查看SCTP关联的初始设置,它基本上是"INIT“和”inital“。我已经测试了客户端将"INIT“发送到服务器的两种方法,基本上是:

  • 使用“open( SctpChannel )”创建SctpChannel对象 尝试{ InetSocketAddress socketAddress =新InetSocketAddress("192.168.52.197",2905);SctpChannel sctpChannel = SctpChannel.open(socketAddress,1,1);sctpChannel.bind(“192.168.1.251”,2906);sctpChannel.connect(socketAddress,1 ,1);

因此,通过这种方式,我可以在Wireshark中看到我的所有网络接口都有"IPv4地址参数“(如下面所示),但是Source得到的是一个发送端口号,而不是我想要的2906,它在绑定中。

​

​

所以..。一旦本地IP/端口的绑定发生在“打开”之后.因此,我将代码更改为:

  • 创建SctpChannel对象,它只是"open()“
  • 绑定本地客户端IP和端口
  • “连接”到远程服务器IP和端口 尝试{ InetSocketAddress socketAddress =新InetSocketAddress("192.168.52.197",2905);SctpChannel sctpChannel = SctpChannel.open();sctpChannel.bind(“192.168.1.251”,2906);sctpChannel.connect(socketAddress,1 ,1);

通过这种方式,我可以在wireshark中看到预期的源/目标端口(2906/2905),但是INIT没有"IPv4地址参数“。

​

那么,有人知道为什么我在INIT中缺少"IPv4地址参数“的第二个代码吗?我错过了什么吗?

任何帮助都是很受欢迎的。

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2018-09-13 20:34:25

INIT/INIT_ACK块中的IP地址是可选参数。如果您的端点是签名的,IP地址可能不包括在INIT/INIT_ACK块中。远程端仍然可以从IP报头中检索有关对等地址的信息。

从根本上讲,这种行为的原因是传递了哪些参数来打开()。没有任何参数的Open()和具有指定远程地址的open()以不同的方式工作。

如果您使用套接字地址为远程端调用SctpChannel.open(socketAddress,1,1),它将有效地打开通道并连接到远程端(请参阅开放文档 )。在本例中,bind()和connect()调用是非常无用的。因此,由于在建立连接之前没有bind()调用,所以您使用的是具有随机端口(56044)和所有可用接口的IP地址的“默认”端点。

在第二种情况下,当您不为open()指定socketAddress时,它只是打开通道,但在这个阶段没有连接到远程终端。因此,bind()调用成功地指定了端点详细信息(端口和IP地址),当调用connect()时,它实际上是使用刚才创建的端点(192.168.1.251:2906)来建立与远程终端的连接。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52305560

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档