Chrome Packaged Appのsocket apiで、UDPのbroadcastでの送受信を行なって、IP Messenger的なものを作ってみようと思ったのですが、どうもできなくて受信までにとどまっていたのが、前回(勉強会)までのお話。ソースコード(https://github.com/civic/chrome-app-udpsocket)
その後Choromiumのソースや、issuesをみてたらいろいろと情報があったので追加報告しておきます。
UDPの送信はできるが、broadcastでできないのは、setsockoptがないため?
勉強会の時も、そんなことをチラッと話したのですが、やっぱりそれが原因らしいです。
Chromeのsocket api にはsetsockoptがなくて今後も追加されなそう
We decided not expose this low level socket API. So close it as WontFix.
ためしにsetsockopt相当のことがないままにブロードキャストアドレスを指定して送信すると、chrome.socket.writeのcallbackで、
Object {bytesWritten: -10}
というオブジェクトが渡される。bytesWrittenが負の値の時にエラーという仕様らしいのですが、エラーコードがよくわからない!!
chrome.socketのエラーコードについて
chromiumのソースを探したらこれっぽい。現状のドキュメントでは、chrome.socketのerrorコードを知るには、このヘッダーファイルを常にリファレンスとして見ておかないといけませんね。。
src.chromium.org/chrome/trunk/src/net/base/net_error_list.h
// Permission to access a resource, other than the network, was denied.
NET_ERROR(ACCESS_DENIED, -10)
Permission ACCESS_DENIEDということで、やっぱりsetsockoptしてない時と同じエラーです。
同梱のpythonの送信プログラムでも、送信するときにsetsockoptしてないとPermission deniedだったし。
Traceback (most recent call last):
File "sender.py", line 7, in
clientsock.sendto(msg, ("
socket.error: [Errno 13] Permission denied
ということで、ブロードキャストで送信するIP Messenger的なアプリを作るのは仕様的に無理っぽい感じになりました。おしまい。