Hatena::ブログ(Diary)

(ひ)メモ このページをアンテナに追加 RSSフィード

2007-10-21 (Sun)

離れたところからGrowlで通知 - UDPのパケットをSSHでポートフォワードする方法

  • Growlに、LANの外のマシンから通知リクエストを投げたい。
  • Growlは、リモートから通知リクエストを受ける機能がある。
    • UDPの9887番ポートを使用
  • が、Growlが動いているマシンと通知リクエストを行うマシンは、それぞれ異なるLANに属していて、直接通信できない。
  • そんなときお手軽便利なのは、SSHのポートフォワード。これでずるっとトンネルを開通すればいい。
  • が、TCPのパケットしかポートフォワードできない。

というわけで、

  • 発信側のマシン
  • 受信側のマシン
    • stoneでTCPUDP
    • Growlに着信

な構成にすればOK

が、Mac (Mac OS X 10.4.10, Intel) だと stone (2.3d) のUDP/TCP変換がうまく動かない —もうちょっと具体的にいうと、sendtoがエラーリターンする(調査中…)—

TCP5>UDP6: sendto failed err=56: to 127.0.0.1:9889/udp

56 EISCONN Socket is already connected. A connect request was made on an already connected socket; or, a sendto or sendmsg request on a connected socket specified a destination when already connected.

Page Not Found - Apple Developer

ので、Growlなマシンと同じLAN内にあるLinuxマシンでTCPUDPの変換をしました。

図にするとこんな感じ。

┏━━━━━━━━━━━━━━━━━
┃┌[notifier]───────────
┃│Net::Growl
┃│↓
┃│localhost:9887/udp
┃│  stone // stone -nr localhost:9888 localhost:9887/udp
┃│↓
┃│localhost:9888/tcp
┃│  ssh   // ssh -L 9888:localhost:9888 relay
┃└────────────────
┗━━━━━━━━━━━━━━━━━
  ↓
〜〜〜
  ↓
┏━━━━━━━━━━━━━━━━━
┃┌[relay ]────────────
┃│localhost:9888/tcp
┃│  stone // stone -nr growl:9887/udp localhost:9888
┃└────────────────
┃  ↓
┃┌[growl ]────────────
┃│*:9887/udp
┃│  Growl
┃└────────────────
┗━━━━━━━━━━━━━━━━━

追記 2007-10-22 14:05

Mac (Mac OS X 10.4.10, Intel)とFreeBSD 6.2で、

stone-2.3d
本文と同じく、EISCONNが発生。
stone.c 2.3.2.2
正常に通信成功。

を確認しました。対応ありがとうございました!> id:gcd san

また、『UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI:ソケットとXTI』の「8.11 UDPにおけるconnect関数」(p.216) に関連する記述がありました。

要約すると、接続済みUDPソケット(connectしたもの)に対して終点指定ありのsendtoを行った場合の結果は以下のようになるそうです。

環境結果
4.4BSDEISCONN
Posix.1gEISCONN
Solaris 2.5OK
Linux 2.6OK (これは私の実験の結果から)

sarumarusarumaru 2007/10/22 03:22 connect()した相手に対する sendto()ですよね。FreeBSDでもエラーになりますね。
3030行目付近の sendto()の最後を NULL, 0 にしてみたら
うまくいきませんでしょうか?
SUSv3 だとこの場合の sendto()はエラーを返しても返さなくてもいいみたいなんですが、UDPなプログラム書いたことないので、よく知りません…。

gcdgcd 2007/10/22 12:56 sendto の問題というよりは、UDP なのに connect してしまっている orz のが問題であるような気がしています。とりあえずの修正版を CVS に上げましたので、ご確認いただけると幸いです。

はてなユーザーのみコメントできます。はてなへログインもしくは新規登録をおこなってください。

2003 | 11 | 12 |
2004 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 10 | 11 | 12 |
2005 | 01 | 02 | 03 | 05 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 12 |
2012 | 01 | 02 | 03 | 06 | 08 | 10 | 11 | 12 |
2013 | 01 | 02 | 03 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2014 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 10 |
2015 | 01 | 02 | 07 | 10 |
2016 | 01 | 05 | 10 | 12 |
2017 | 07 |