我正在尝试发送一个 MSEARCH 数据报包以在我的 LAN 上发现我的 Roku 设备。我已经用 Java 实现了这个,它工作得很好,但是我正在尝试学习 Haskell。虽然我没有收到任何编译错误,但代码在调用recv
.
这是我正在进行的工作,无耻地大部分抄袭了Network.Socket.ByteString 文档页面。
import Network.Socket hiding (recv)
import Network.Socket.ByteString (recv, sendAll)
import qualified Data.ByteString.Char8 as C
msearch = "M-SEARCH * HTTP/1.1\r\nHost: 239.255.255.250:1900\r\nMan: \"ssdp:discover\"\nST: roku:ecp\r\n\r\n"
main :: IO ()
main = withSocketsDo $
do addrinfos <- getAddrInfo Nothing (Just "239.255.255.250") (Just "1900")
let serveraddr = head addrinfos
sock <- socket (addrFamily serveraddr) Datagram defaultProtocol
connect sock (addrAddress serveraddr)
putStrLn "Sending: "
putStrLn msearch
sendAll sock $ C.pack msearch
msg <- recv sock 1024
close sock
putStr "Got response: "
C.putStrLn msg
在 Java 中:
import java.net.*;
public class Msearch {
public static void main(String[] args) {
try {
// MSEARCH query
String MSEARCH = "M-SEARCH * HTTP/1.1\r\nHost: 239.255.255.250:1900\r\nMan: \"ssdp:discover\"\r\nST: roku:ecp\r\n\r\n";
byte[] sendData = MSEARCH.getBytes();
// Send a datagram packet
System.out.println("Sending:\n" + MSEARCH);
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, InetAddress.getByName("239.255.255.250"), 1900);
DatagramSocket clientSocket = new DatagramSocket();
clientSocket.send(sendPacket);
// Wait for response & close
byte[] receiveData = new byte[1024];
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
clientSocket.receive(receivePacket);
clientSocket.close();
// Print the response
String response = new String(receivePacket.getData());
System.out.println("Got response:\n" + response);
} catch (Exception e) {
// ...
}
}
}
Java 版本完美运行,产生:
Sending:
M-SEARCH * HTTP/1.1
Host: 239.255.255.250:1900
Man: "ssdp:discover"
ST: roku:ecp
Got response:
HTTP/1.1 200 OK
Cache-Control: max-age=3600
ST: roku:ecp
USN: uuid:roku:ecp:2N00G7750045
Ext:
Server: Roku UPnP/1.0 MiniUPnPd/1.4
LOCATION: http://192.168.1.169:8060/
Haskell 版本在调用recv
. 我仍在学习 Haskell,我不确定我在做什么不同的做法可能会导致这种情况。我将不胜感激任何见解!