You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Racket中with-handlers未按预期工作:TCP端口检测函数始终返回#t

问题分析与解决

你的代码问题出在函数最后固定返回了#t——不管with-handlers块里的逻辑是成功建立连接,还是触发异常返回#f,函数都会执行最后的#t并返回它,这就是为什么始终得到#t。

修正后的代码

#lang racket

(define (port-open? host port)
  (with-handlers ([exn:fail:network? (lambda (exp) #f)])
    (call-with-values
     (lambda () (tcp-connect host port))
     (lambda (in out)
       (close-input-port in)
       (close-output-port out)
       #t))))

(port-open? "127.0.0.1" 70)

关键改动说明

  • 移除了函数末尾多余的#t,让with-handlers块的执行结果直接作为函数返回值
  • 新增端口关闭逻辑:tcp-connect成功会返回输入、输出两个端口,必须手动关闭避免资源泄漏,这里用call-with-values接收端口并关闭,之后返回#t表示端口开放
  • 异常处理逻辑保持不变:遇到网络异常(比如端口关闭、无法连接)时返回#f

内容的提问来源于stack exchange,提问作者beep

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 23:19:00