如何使用Racket监听数据包?

时间:2013-08-04 06:57:32

标签: port racket packet packet-capture packet-sniffers

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

这是我的代码(大部分来自Racket's Wikipedia entry)。

#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请求的数据包?

3 个答案:

答案 0 :(得分:4)

  

但是,我似乎遇到了对数据包嗅探器如何工作的理解

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

但是,请注意,如果您被动地嗅探流量,您将看到的是原始链路层数据包;要从中提取TCP内容,您必须解析链接层标头,IP标头和TCP标头以便查找内容。我会告诉你如何做到这一点。

答案 1 :(得分:0)

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

Racket拥有各种各样的图书馆。快速搜索文档了:Web Server: HTTP Server

答案 2 :(得分:0)

packet-socket库(最新更新于2017年)允许访问原始以太网帧。 packet-socket on pkgd