2

我正在尝试发送一个 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,我不确定我在做什么不同的做法可能会导致这种情况。我将不胜感激任何见解!

4

0 回答 0