ZetCode

Dart RawSocketOption

最后修改于 2025 年 4 月 4 日

Dart 中的 RawSocketOption 类提供了对套接字配置选项的低级访问。它与 RawSocket 一起用于自定义网络协议实现。

RawSocketOption 允许设置未通过更高级别 API 暴露的平台特定套接字选项。它是 Dart dart:io 库的一部分。

基本定义

RawSocketOption 表示可以在 RawSocket 上设置或查询的套接字选项。它封装了选项级别和名称。

关键属性包括选项级别(SOL_SOCKET、IPPROTO_TCP 等)、选项名称和值类型。选项在操作系统级别影响套接字行为。

启用套接字重用

此示例演示了启用 SO_REUSEADDR 以允许地址重用。

main.dart
import 'dart:io';

void main() async {
  var socket = await RawSocket.connect('localhost', 8080);
  
  var reuseAddr = RawSocketOption.fromInt(
    SocketOption.SOL_SOCKET,
    SocketOption.SO_REUSEADDR,
    1 // enable
  );
  
  socket.setOption(reuseAddr);
  print('SO_REUSEADDR set to 1');
  
  socket.close();
}

我们创建一个套接字并启用 SO_REUSEADDR 以允许绑定到 TIME_WAIT 状态的地址。这对于频繁重启的服务器套接字很有用。

$ dart main.dart
SO_REUSEADDR set to 1

设置 TCP Keepalive

此示例配置 TCP Keepalive 以检测死连接。

main.dart
import 'dart:io';

void main() async {
  var socket = await RawSocket.connect('google.com', 80);
  
  var keepAlive = RawSocketOption.fromInt(
    SocketOption.SOL_SOCKET,
    SocketOption.SO_KEEPALIVE,
    1 // enable
  );
  
  socket.setOption(keepAlive);
  print('TCP Keepalive enabled');
  
  socket.close();
}

我们启用 SO_KEEPALIVE,这会导致 TCP 定期验证连接是否仍然处于活动状态。这有助于在没有应用程序流量的情况下检测网络故障。

$ dart main.dart
TCP Keepalive enabled

配置接收缓冲区大小

此示例设置套接字接收缓冲区大小以提高性能。

main.dart
import 'dart:io';

void main() async {
  var socket = await RawSocket.connect('example.com', 80);
  
  var rcvBuf = RawSocketOption.fromInt(
    SocketOption.SOL_SOCKET,
    SocketOption.SO_RCVBUF,
    65536 // 64KB buffer
  );
  
  socket.setOption(rcvBuf);
  print('Receive buffer size set to 64KB');
  
  socket.close();
}

我们配置 SO_RCVBUF 来增加内核接收缓冲区大小。更大的缓冲区可以提高高带宽连接的吞吐量。

$ dart main.dart
Receive buffer size set to 64KB

禁用 Nagle 算法

此示例禁用 Nagle 算法以实现低延迟通信。

main.dart
import 'dart:io';

void main() async {
  var socket = await RawSocket.connect('localhost', 9000);
  
  var noDelay = RawSocketOption.fromInt(
    SocketOption.IPPROTO_TCP,
    SocketOption.TCP_NODELAY,
    1 // disable Nagle
  );
  
  socket.setOption(noDelay);
  print('Nagle\'s algorithm disabled');
  
  socket.close();
}

TCP_NODELAY 禁用 Nagle 算法,该算法会缓冲小数据包。这会降低交互式应用程序的延迟,但代价是数据包数量增加。

$ dart main.dart
Nagle's algorithm disabled

查询套接字选项

此示例展示了如何查询当前套接字选项值。

main.dart
import 'dart:io';

void main() async {
  var socket = await RawSocket.connect('example.com', 80);
  
  var queryRcvBuf = RawSocketOption(
    SocketOption.SOL_SOCKET,
    SocketOption.SO_RCVBUF,
    4 // buffer for int result
  );
  
  var bufSize = socket.getOption(queryRcvBuf);
  print('Current receive buffer size: ${bufSize.getInt32(0)} bytes');
  
  socket.close();
}

我们创建一个带有缓冲区来保存结果的 RawSocketOption,然后调用 getOption 来检索当前值。缓冲区必须足够大。

$ dart main.dart
Current receive buffer size: 87380 bytes

最佳实践

来源

Dart RawSocketOption 文档

本教程涵盖了 Dart 的 RawSocketOption 类,并通过实际示例展示了用于性能和可靠性调整的常见套接字配置。

作者

我的名字是 Jan Bodnar,我是一位充满热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。至今,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出 所有 Dart 教程