1

我正在尝试使用 Racket 来监听通过我机器上的端口 80 移动的数据包。但是,我似乎对数据包嗅探器如何工作的理解,对 Racket 如何工作的理解,或两者兼而有之。

这是我的代码(大部分来自Racket 的维基百科条目)。

#lang racket

(require racket/tcp)

(define listener (tcp-listen 80))

(define (echo-server)
  (define-values (in out) (tcp-accept listener))
  (thread (lambda () (copy-port in out) 
                     (print (read in)) 
                     (close-output-port out)))
  (echo-server))

(echo-server)

当我连接到时,localhost:80我会收到一些反馈 - 但是当我尝试使用我的网络浏览器时,我无法打印任何东西。如何修改此代码,以便它可以侦听从 Web 请求传入和传出的数据包?

4

3 回答 3

4

但是,我似乎对数据包嗅探器的工作原理有所了解

是的。数据包嗅探器使用常规套接字;它使用任何可用的机制来被动地观察网络接口接收或发送的数据包。如果您只想查看端口 80 上的 HTTP 流量,而不响应该流量或更改该流量,您将需要使用诸如 libpcap/WinPcap 之类的东西,它们在您的操作系统上使用适当的机制来被动地观察数据包。例如,请参见Racket 的 SPeaCap 库

但是请注意,如果您被动地嗅探流量,您将看到的是原始链路层数据包;要从中提取 TCP 内容,您必须解析链路层标头、IP 标头和 TCP 标头才能找到内容。我会把它留给你来弄清楚如何做到这一点。

于 2013-08-04T22:34:56.067 回答
0

您的 TCP 服务器只是充当回显服务器,这意味着它不符合HTTP。您的浏览器期待有效​​的 HTTP 响应,因此它不起作用也就不足为奇了。

Racket 有各种库。快速搜索文档发现:Web Server: HTTP Server

于 2013-08-04T07:17:11.197 回答
0

packet-socket库(最后更新于 2017 年)允许访问原始以太网帧。pkgd 上的数据包套接字

于 2019-11-21T00:13:07.363 回答