ZetCode

Dart SocketOption

最后修改于 2025 年 4 月 4 日

Dart 中的 SocketOption 类提供了一种配置网络通信的套接字选项的方法。它是 Dart 的 dart:io 库的一部分,可与 TCP 和 UDP 套接字一起使用。

套接字选项控制网络套接字的各种低级行为,例如超时设置、缓冲区大小和特定于协议的配置。它们对于微调网络性能至关重要。

基本定义

SocketOption 表示可以应用于套接字的套接字级别配置选项。每个选项都有一个级别和名称来标识它。

该类提供了常用选项的预定义常量,并允许创建自定义选项。选项使用套接字的 setOption 方法进行应用。

设置套接字超时

此示例演示了如何为套接字设置接收超时。

main.dart
import 'dart:io';

void main() async {
  var socket = await Socket.connect('example.com', 80);
  
  // Set receive timeout to 5 seconds
  socket.setOption(SocketOption.tcpNoDelay, true);
  socket.setOption(SocketOption.receiveTimeout, Duration(seconds: 5));
  
  print('Socket options configured');
  await socket.close();
}

我们创建一个 TCP 套接字并设置两个选项:TCP_NODELAY 和接收超时。如果没有接收到数据,超时将导致套接字抛出异常。

$ dart main.dart
Socket options configured

在 UDP 套接字上启用广播

此示例演示了如何为 UDP 套接字启用广播。

main.dart
import 'dart:io';

void main() async {
  var socket = await RawDatagramSocket.bind(InternetAddress.anyIPv4, 0);
  
  // Enable broadcast
  socket.setOption(SocketOption.broadcast, true);
  
  print('Broadcast enabled on UDP socket');
  socket.close();
}

我们创建一个 UDP 套接字并启用广播功能。这允许将数据包发送到本地网络的广播地址。

$ dart main.dart
Broadcast enabled on UDP socket

配置 Keep-Alive

此示例演示了如何为套接字启用 TCP Keep-Alive。

main.dart
import 'dart:io';

void main() async {
  var socket = await Socket.connect('example.com', 80);
  
  // Enable TCP keep-alive
  socket.setOption(SocketOption.keepAlive, true);
  
  print('Keep-alive enabled');
  await socket.close();
}

TCP Keep-Alive 会定期检查连接是否仍然有效。这有助于在没有数据传输时检测断开的连接。

$ dart main.dart
Keep-alive enabled

设置自定义套接字选项

此示例演示了如何设置 Dart 中未预定义的自定义套接字选项。

main.dart
import 'dart:io';

void main() async {
  var socket = await Socket.connect('example.com', 80);
  
  // Create custom socket option (IP_TOS on Linux)
  var customOption = SocketOption(SocketOption.levelIP, 1, 0x10);
  socket.setOption(customOption, true);
  
  print('Custom socket option set');
  await socket.close();
}

我们通过指定级别、选项名称和值来创建一个自定义套接字选项。此示例为服务质量设置了 IP 服务类型 (TOS) 字段。

$ dart main.dart
Custom socket option set

配置套接字缓冲区大小

此示例演示了如何设置套接字发送和接收缓冲区大小。

main.dart
import 'dart:io';

void main() async {
  var socket = await Socket.connect('example.com', 80);
  
  // Set buffer sizes
  socket.setOption(SocketOption.sendBufferSize, 8192);
  socket.setOption(SocketOption.receiveBufferSize, 16384);
  
  print('Socket buffer sizes configured');
  await socket.close();
}

我们配置套接字的发送和接收缓冲区大小。更大的缓冲区可以提高高带宽连接的性能,但会占用更多内存。

$ dart main.dart
Socket buffer sizes configured

最佳实践

来源

Dart SocketOption 文档

本教程介绍了 Dart 的 SocketOption 类,并提供了实用的示例,展示了网络编程中常见的套接字配置和自定义选项。

作者

我叫 Jan Bodnar,是一位热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出 所有 Dart 教程