直に Network.Socket を叩くよ!!
ってまぁ、流石にそんなことしてる人は沢山いらっしゃいまして
いくらでもサンプルが出てくるんですがシンプルだったのは
関数型プログラミング言語Haskell Part6
2ちゃんねるの過去ログの 607 さんでした
ちなみに検索語は "import Network.Socket"
で、挙がってた sample は
import Network.Socketおぉぉ
main = putStrLn =<< do
sock <- socket AF_INET Stream 0
addr <- inet_addr "66.249.89.104" >>= \x -> return $ SockAddrInet 80 x
connect sock addr
send sock "GET / HTTP/1.1\nHost: www.google.co.jp\n\n"
recv sock 10000000 >>= \x -> sClose sock >> return x
IP address ってのはちょっと寂しかったので
名前を解決してやりたいなと思いもうちょっとググりました
Network.BSD
なるほど、getHostByName 使えと
上の2ちゃんのログの 604 さんが
インタフェースはCのAPIそのままだから、そっちを調べるべき。っつってたので
C のこと分かってればいいみたいです
わたし? えぇ、分かってないですけど
> :t getHostByNameあと、HostName は String のこと
getHostByName :: HostName -> IO HostEntry
> :i HostEntry
data HostEntry
= HostEntry {hostName :: HostName,
hostAliases :: [HostName],
hostFamily :: Network.Socket.Internal.Family,
hostAddresses :: [Network.Socket.Internal.HostAddress]}
-- Defined in Network.BSD
HostEntry の中の hostAddresses に IP address が入ってるので
> getHostByName "www.google.com" >>= return . hostAddresses10進でアドレス見せてくれます
[1750726978,1666840898,2472147266,1733949762]
つわけで、こんなん作ったら
import Systemこんなん出ました
import Network.BSD
import Network.Socket
main = do (host:path:_) <- getArgs
addr <- return . head . hostAddresses =<< getHostByName host
sock <- socket AF_INET Stream 0
connect sock (SockAddrInet 80 addr)
send sock $ "GET " ++ path ++ " HTTP/1.1\nHost: " ++ host ++ "\n\n"
putStrLn =<< recv sock 100000
sClose sock
$ ./get www.ietf.org /rfc/rfc5280.txt
HTTP/1.1 200 OK
Date: Fri, 20 Nov 2009 08:10:29 GMT
Server: Apache/2.2.4 (Linux/SUSE) mod_ssl/2.2.4 OpenSSL/0.9.8e PHP/5.2.6 with Suhosin-Patch mod_python/3.3.1 Python/2.5.1 mod_perl/2.0.3 Perl/v5.8.8
Last-Modified: Wed, 07 May 2008 17:42:25 GMT
ETag: "1caf1b6-56144-7cddc240"
Accept-Ranges: bytes
Content-Length: 352580
Vary: Accept-Encoding
Content-Type: text/plain
Network Working Group D. Cooper
Request for Comments: 5280 NIST
Obsoletes: 3280, 4325, 4630 S. Santesson
Category: Standards Track Microsoft
S. Farrell
Trinity College Dublin
S. Boeyen
Entrust
R. Housley
Vigil Security
W. Polk
NIST
May 2008
Internet X.509 Public Key Infrastructure
recv に渡す数字でちゃんと表示内容変化してるのに
気付いていなかったみたいです
socket が分かっていない...
0 件のコメント:
コメントを投稿