2017-08-09 16 views
0

ように私は、これは非常に基本的なことを知っているが、それは壁に私を押し上げています:関数は、引数

peercert(Socket) -> {ok, Cert} | {error, Reason} 

Types 

Socket = sslsocket() 
Cert = binary() 
The peer certificate is returned as a DER-encoded binary. The certificate can be decoded with public_key:pkix_decode_cert/2. 

[OK]を、素晴らしい:

peercertは、以下のように定義されます。最新のSSLSocketが-recordとして定義されている(のSSLSocket、{FD = nilを、PID = nilの})

だから私は実行します。

New = #sslsocket{pid = Pid}, 
io:fwrite("~n~npeercert~p~n~n", [ssl:peercert(New)]). 

をしかし、私は

no function clause matching ssl:peercert({sslsocket,<0.1277.0>,undefined}) 

は、だから私は実行することをエラーが発生します引数としてPidを指定しても同様のエラーが発生します:

no function clause matching ssl:peercert(<0.1277.0>) 

私は完全に困惑しています。私はそれが前に働いていた、関数は引数としてこれらを取ると言う...

あなたの助けを前にありがとう!

+1

この値は私には間違っています。 'pid ='はタプルの3番目の要素を設定し、2番目の要素は設定しないでください。 'ssl:peercert({sslsocket、nil、Pid})'を実行するとどうなりますか? – Dogbert

+0

ドキュメントによると 'sslsocket()= opaque()'なので、手動で作成するべきではありません。私は実装を見ましたが、私が推測できるのは、 'sslsocket'のどこかに矛盾する定義を含めるか、' sslsocket'が別に定義されているErlangバージョンで動作していることだけです(http://erlang.org /doc/apps/ssl/using_ssl.htmlは "sslsocketの返り値はかなり大きくて不透明であるため[...]で省略されています。"これはもう真実ではない) –

+0

@Dogbert私の見た私はそれを試みたが、それはエラーをスローしなかったが、それは無限に掛かった – Ryan

答えて

1

sslsocket()タイプはsslsocketというレコードではありません。それ以外の場合は#sslsocket{}と書かれます。これは "ブラックボックスタイプ"(実際のタイプは実装の詳細です)ですが、関数ssl:connect()から得ることができます。