首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell中的原始套接字

Haskell中的原始套接字
EN

Stack Overflow用户
提问于 2012-04-19 21:42:37
回答 4查看 2.4K关注 0票数 5

在Network.Socket中提供了一种原始套接字类型,但是在绑定套接字附近有一条注释:“目前只支持Unix域套接字和互联网系列”。如何在haskell中使用原始套接字?

作为Python代码,我想要实现的是:

代码语言:javascript
复制
import binascii
import socket

# Create raw socket.
ethType = b'FFFF' # 2 bytes, has to be >= 0x0600. FFFF is "unavailable" by IEEE.
sock = socket.socket(socket.AF_PACKET, socket.SOCK_RAW)
sock.bind( ('lo', int(ethType,16)) )

# Create packet.
srcMac  = b'000000000000' # 6 bytes
destMac = b'000000000000' # 6 bytes
header = binascii.a2b_hex( destMac + srcMac + ethType ) # 14 bytes
message = b'Hello, World!'
sock.send(header + message)

# Receive such packets
while True: print (sock.recv(65535))

EDIT1:在Haskell中,我使用sock <- socket AF_PACKET Raw 0xFFFF创建套接字,但是bindSocket需要一个SockAddr作为参数,可用的构造函数有

代码语言:javascript
复制
SockAddrInet PortNumber HostAddress  
SockAddrInet6 PortNumber FlowInfo HostAddress6 ScopeID   
SockAddrUnix String

但这些似乎都不正确。

EDIT2:多亏了Yuras的评论,我才能收到数据包:

代码语言:javascript
复制
import Network.Socket
sock <- socket AF_PACKET Raw 0xFFFF
recv sock 0xFFFF

EDIT3:尝试在不绑定套接字的情况下从套接字发送数据包会导致异常:

代码语言:javascript
复制
sock <- socket AF_PACKET Raw 0xFFFF
send sock "\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\255\255"
*** Exception: send: does not exist (No such device or address)

这是有意义的,因为内核不会有任何关于实际传输数据包的接口的线索。有没有办法在Haskell中将(原始)套接字绑定到接口?

EN

Stack Overflow用户

发布于 2012-04-19 23:06:55

首先,你不需要绑定原始套接字来使用它。来自man 7 raw

原始套接字可以使用bind(2)调用绑定到特定的本地地址。如果未绑定,则接收指定IP协议的所有数据包。

如果您想绑定它,那么可以使用bindSocket,因为原始套接字使用与ip相同的sockaddr结构:

原始套接字使用在ip(7)

中定义的标准sockaddr_in地址结构

票数 1
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10229381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档