chrome.socketでのbroadcast送信について 後日談

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がなくて今後も追加されなそう

Issue 125586 – chromium – Socket API doesn’t have setsockopt and getsockopt – An open-source project to help move the web forward. – Google Project Hosting

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 <module>
    clientsock.sendto(msg, ("<broadcast>", 12345));
socket.error: [Errno 13] Permission denied

ということで、ブロードキャストで送信するIP Messenger的なアプリを作るのは仕様的に無理っぽい感じになりました。おしまい。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)