Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell YesSOD获取客户端Ipv4/Ipv6地址_Haskell_Yesod - Fatal编程技术网

Haskell YesSOD获取客户端Ipv4/Ipv6地址

Haskell YesSOD获取客户端Ipv4/Ipv6地址,haskell,yesod,Haskell,Yesod,我想让用户IPv4和/或IPv6在上使用 如何得到它 -----编辑-------- 比如,如果用户访问我的站点,我想检查他们的IP地址,一旦我得到,我想使用来定位他们 以下示例具有默认的IPv4和IPv6地址: {-# LANGUAGE OverloadedStrings #-} import Data.GeoIP2 import Data.IP (IP(..)) main = do geodb <- openGeoDB "GeoLite2-City.mmdb" let ip

我想让用户
IPv4
和/或
IPv6
在上使用

如何得到它

-----编辑--------

比如,如果用户访问我的站点,我想检查他们的IP地址,一旦我得到,我想使用来定位他们

以下示例具有默认的IPv4和IPv6地址:

{-# LANGUAGE OverloadedStrings #-}
import Data.GeoIP2
import Data.IP (IP(..))

main = do
  geodb <- openGeoDB "GeoLite2-City.mmdb"
  let ip = IPv4 "23.253.242.70"
  print $ (findGeoData geodb "en" ip :: Maybe GeoResult)

  let ip2 = IPv6 "2001:4800:7817:104:be76:4eff:fe04:f608"
  print $ (findGeoData geodb "en" ip2 :: Maybe GeoResult)
{-#语言重载字符串}
导入Data.GeoIP2
导入Data.IP(IP(..)
main=do
geodb这应该有效:

import Network.Wai (remoteHost) -- From the wai package
import Data.IP -- From the iproute package
import Network.Socket.Internal (SockAddr(..)) -- From the network package

sockAddrToIP :: SockAddr -> IP
sockAddrToIP sockAddr = case sockAddr of
    SockAddrInet _port hostAddress -> IPv4 $ fromHostAddress hostAddress
    SockAddrInet6 _port _flowInfo hostAddress6 _scopeID -> IPv6 $ fromHostAddress6 hostAddress6
    -- I don't know how to handle these, they might not apply to the web?
    SockAddrUnix _ -> error "Couldn't get IP address"
    SockAddrCan _ -> error "Couldn't get IP address"

getHomeR :: Handler Html
getHomeR = do
    host <- remoteHost <$> waiRequest
    let ip = sockAddrToIP host

    traceShowM $ "Remote host is " ++ show host
    traceShowM $ "IP is " ++ show ip
    -- (Finish implementing the handler here)

事实上,我对网络、IP地址或任何东西都不太了解,但类型排列整齐,代码似乎正常工作。如果有人可以验证是否可以忽略
SockAddrUnix
SockAddrCan
,那就好了。

谢谢,但每次我检查它时,总是返回本地主机IP地址
127.0.0.1:54575
。所以我最终使用了
lookupader“X-Real-IP”
lookupader“X-Forwarded-For”
。啊,好的。同样,我对这个主题不是非常熟悉,但它看起来像是由nginx或其他反向代理为您的应用程序设置的标题?它来自。我不知道它在
keter
上是否有效。我要先检查一下它在那里是否有效。:)
"Remote host is 127.0.0.1:54575"
"IP is 127.0.0.1"