【发布时间】:2014-08-05 19:41:33
【问题描述】:
使用Wireshark调试,在localhost上发送UDP包时收到如下错误:
Destination Unreachable (Port Unreachable)
Checksum: 0x0000 (Illegal)
我首先在 10000 - 15000 之间的端口上使用
构建我的服务器startServer :: Port -> IO Server
startServer port = withSocketsDo $ do
-- Look up the server address and port information.
addrs <- getAddrInfo (Just $ defaultHints { addrFlags = [AI_PASSIVE] }) Nothing (Just port)
let serverAddress = head addrs
-- Bind to the socket.
sock <- socket (addrFamily serverAddress) Datagram defaultProtocol
bindSocket sock (addrAddress serverAddress)
-- Create the server and run the client send and receive threads.
clients <- newMVar $ createEmptyClients
let server = Server sock port clients
_ <- forkIO $ forever $ receiveClientJoin server
return server
我正在监听通过 UDP 连接的新客户端
-- | Connected a client to the server.
receiveClientJoin :: Server -> IO ()
receiveClientJoin server = do
print "Receiving"
(msg, _, clSockAddr) <- recvFrom (sSocket server) 4096
print $ "Server received client join message: " ++ msg
我正在使用客户端连接到服务器
connectToServer port = do
-- Get the server's address and port information.
addrInfo <- getAddrInfo Nothing (Just "localhost") (Just port)
let serverAddr = head addrInfo
sock <- socket (addrFamily serverAddr) Datagram defaultProtocol
sendTo sock "Hello from this client!" (addrAddress serverAddr)
为什么我的客户的数据包没有找到服务器?
【问题讨论】:
-
你能发布一个完整的编译示例吗?
-
这可能是 ipv4 与 ipv6 的问题。如果你使用
127.0.0.1而不是 localhost 会发生什么? -
@ThomasM.DuBuisson 谢谢!更改为
127.0.0.1后即可使用。您能否简要说明一下为什么会出现这个问题?
标签: sockets haskell client-server