树叶云鸿蒙OS教程-SocketOptions-鸿蒙OS (树叶云朵图片)

教程大全 2025-07-16 15:31:03 浏览

获取套接字的本地地址绑定(此选项不能“设置”,只能“获取”,因为套接字是在创建时绑定的,因此不能更改本地绑定地址)。 套接字的默认本地地址是 INADDR_ANY,表示多宿主主机上的任何本地地址。 多宿主主机可以使用此选项仅接受到其地址之一的连接(在 Serversocket 或>SO_BROADCAST

static final int SO_BROADCAST

为套接字设置 SO_BROADCAST。 此选项启用和禁用进程发送广播消息的能力。 它仅支持数据报套接字,并且仅在支持广播消息概念的网络(例如以太网、令牌环等)上受支持,并且默认为>SO_KEEPALIVE

static final int SO_KEEPALIVE

如果为 TCP 套接字设置了 keepalive 选项,并且在 2 小时内没有通过套接字在任一方向上交换数据(注意:实际值取决于实现),TCP 会自动向对等方发送 keepalive 探测。 此探测是对等方必须响应的 TCP 段。 期望三个响应之一: 1. 对等点以期望的 ACK 响应。 不通知应用程序(因为一切正常)。 TCP 将在另外 2 小时不活动后发送另一个探测。 2. 对端响应一个 RST,告诉本地 TCP 对端主机已经崩溃并重新启动。 插座已关闭。 3. 对端无响应。 插座已关闭。 此选项的目的是检测对等主机是否崩溃。 仅对 TCP 套接字有效:SocketImpl

static final int SO_LINGER

指定关闭时延迟超时。 此选项禁用/启用从 TCP 套接字的 CLOSE() 立即返回。 使用非零整数超时启用此选项意味着 close() 将阻止等待写入对等方的所有数据的传输和确认,此时套接字将正常关闭。 达到延迟超时后,套接字将通过 TCP RST 强制关闭。 启用超时为零的选项会立即强制关闭。 如果指定的超时值超过 65,535,它将减少到 65,535。

仅对 TCP 有效:SocketImpl

SO_OOBINLINE

static final int SO_OOBINLINE

当设置 OOBINLINE 选项时,套接字上接收到的任何 TCP 紧急数据都将通过套接字输入流接收。 当该选项被禁用(这是默认设置)时,紧急数据将被静默丢弃。

static final int SO_RCVBUF

设置平台用于传入网络 I/O 的底层缓冲区大小的提示。 当在 set 中使用时,这是应用程序向内核提出的关于用于通过套接字接收数据的缓冲区大小的建议。 在 get 中使用时,它必须返回平台在此套接字上接收数据时实际使用的缓冲区大小。 适用于所有套接字:SocketImpl、DatagramSocketImpl

SO_REUSEADDR

static final int SO_REUSEADDR

为套接字设置 SO_REUSEADDR。 这仅用于 java 中的 MulticastSockets,默认情况下为 MulticastSockets 设置。

适用于:DatagramSocketImpl

static final int SO_SNDBUF

设置平台用于传出网络 I/O 的底层缓冲区大小的提示。 当在 set 中使用时,这是应用程序向内核提出的关于用于通过套接字发送的数据的缓冲区大小的建议。 在 get 中使用时,这必须返回平台在此套接字上发送数据时实际使用的缓冲区大小。 适用于所有套接字:SocketImpl、DatagramSocketImpl

SO_TIMEOUT

static final int SO_TIMEOUT

设置阻塞 Socket 操作的超时时间:

 ServerSocket.accept(); SocketInputStream.read();>TCP_NODELAY

static final int TCP_NODELAY

禁用此连接的 Nagle 算法。 写入网络的数据不会缓冲等待对先前写入数据的确认。

仅对 TCP 有效:SocketImpl。

方法详情

setOption

树叶云朵图片

void setOption(int optID, Object value) throws SocketException

启用/禁用 optID 指定的选项。 如果要启用该选项,并且它需要一个特定于选项的“值”,则将其传入值。 值的实际类型是特定于选项的,传递不属于预期类型的内容是错误的:

 SocketImpl s; ... s.setOption(SO_LINGER, new Integer(10));// OK - set SO_LINGER w/ timeout of 10 sec. s.setOption(SO_LINGER, new Double(10));// ERROR - expects java.lang.Integer

如果请求的选项是二进制的,则可以通过 java.lang.Boolean 使用此方法设置:

 s.setOption(TCP_NODELAY, new Boolean(true));// OK - enables TCP_NODELAY, a binary option

任何选项都可以使用此方法和布尔值(false)禁用:

 s.setOption(TCP_NODELAY, new Boolean(false));// OK - disables TCP_NODELAY s.setOption(SO_LINGER, new Boolean(false));// OK - disables SO_LINGER

对于具有 on 和 off 概念并且需要非布尔参数的选项,将其值设置为 Boolean(false) 以外的任何值都会隐式启用它。 如果选项无法识别、套接字已关闭或发生一些低级错误,则抛出 SocketException

参数:

参数名称参数描述
标识选项
套接字选项的参数
Throw名称Throw描述
SocketException如果该选项无法识别,则套接字已关闭,或者发生了一些低级错误

getOption

Object getOption(int optID) throws SocketException

获取选项的值。 如果启用,二进制选项将返回 java.lang.Boolean(true),如果禁用,则返回 java.lang.Boolean(false),例如:

 SocketImpl s; ... Boolean noDelay = (Boolean)(s.getOption(TCP_NODELAY)); if (noDelay.booleanValue()) {// true if TCP_NODELAY is enabled... ... }

对于将特定类型作为参数的选项,getOption(int) 将返回参数的值,否则将返回 java.lang.Boolean(false):

 Object o = s.getOption(SO_LINGER); if (o instanceof Integer) {System.out.print("Linger time is " + ((Integer)o).intValue()); } else {// the true type of o is java.lang.Boolean(false); }

参数:

参数名称参数描述
一个int标识要获取的选项

返回:

option的值

Throw名称Throw描述
SocketException如果套接字关闭
SocketException如果optID在协议栈中是未知的(包括SocketImpl)


send是TCP通信的发送方法,在send之前保证建立了socket通信连接,socket中记录了与之连接的对方的地址,所以可以说是第一个参数SOCKET记录了要发往的地址;注:TCP套接字只能进行一对一的通信,所以不需要地址再来进行目的地的标识,套接字就可以确定要发往的方向;SOCKET Sock;Sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);connect(Sock,。 。 。 。 。 。 。 );char *buf;send(Sock,buf,strlen(buf),0);其中就是Sock记录的你要发往的目的地;只有UDP通信才要写入对方地址,UDP套接可以进行多对多的通信,所以在发送的时候要写入对方地址;UDP调用sendto()方法;可以查看MSDN

本文版权声明本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请联系本站客服,一经查实,本站将立刻删除。

发表评论

热门推荐