問題概要#

ポート番号・起動順序は正しく設定しているのに、FlightGearとJSBSim間でUDPデータが送受信されない問題が発生します。JSBSim側では正常にシミュレーションが進行しているが、FlightGearには何も表示されません。

原因#

WindowsファイアウォールがUDPポート5550の通信をブロックしています。

詳細な原因#

  1. 初回実行時の選択ミス: Windowsセキュリティの警告ダイアログで「ブロックする」を選択してしまった
  2. ルールの不在: Python.exeとfgfs.exeの受信・送信ルールが存在しない
  3. デフォルトのブロック: Windowsファイアウォールはデフォルトでインバウンド接続をブロック

よくあるケース:

  • 初回実行時に警告ダイアログを閉じてしまい、ブロック状態のまま
  • Python仮想環境を変更した際、新しいpython.exeにルールが適用されていない
  • FlightGearを再インストールした後、ルールが削除された

解決方法#

Windows Firewall設定手順#

ステップ1: ファイアウォール詳細設定を開く

  1. 「Windowsセキュリティ」を開く(Windowsキー → 「Windowsセキュリティ」で検索)
  2. 「ファイアウォールとネットワーク保護」をクリック
  3. 「詳細設定」をクリック(管理者権限が必要

ステップ2: 受信の規則を作成(Python.exe用)

  1. 左側メニューから「受信の規則」を選択
  2. 右側メニューから「新しい規則…」をクリック
  3. 規則の種類: プログラム を選択 → 次へ
  4. プログラムパス: このプログラムのパス を選択
    • パス例: C:\Users\<ユーザー名>\AppData\Local\Programs\Python\Python310\python.exe
    • 仮想環境使用時: C:\Users\<ユーザー名>\project\.venv\Scripts\python.exe
  5. 操作: 接続を許可する → 次へ
  6. プロファイル: すべてチェック → 次へ
  7. 名前: Python JSBSim UDP → 完了

ステップ3: 受信の規則を作成(fgfs.exe用)

  1. 同様の手順で fgfs.exe のルールを作成
  2. プログラムパス: C:\Program Files\FlightGear 2020.3\bin\fgfs.exe
  3. 名前: FlightGear UDP

ステップ4: 送信の規則も作成

左側メニューから「送信の規則」を選択し、同様の手順でPython.exeとfgfs.exeのルールを作成。

確認方法#

ポート5550の使用状況を確認:

netstat -ano | findstr 5550

出力例:

UDP    0.0.0.0:5550           *:*                                    12345
UDP    [::]:5550              *:*                                    12345

これが表示されれば、ポート5550がリッスン中です。

予防策#

1. README.mdにファイアウォール設定を記載#

初回実行時にファイアウォール設定が必要であることを明記:

## 初回セットアップ

### Windows Firewall設定(Windows環境のみ)

初回実行時にWindowsファイアウォールの警告が表示されたら、
**必ず「アクセスを許可する」を選択**してください。

手動設定が必要な場合は、docs/firewall_setup.mdを参照してください。

2. 起動スクリプトにファイアウォール確認機能を追加#

ポート5550がブロックされていないかチェック:

import socket

def check_firewall():
    """ファイアウォールがポート5550をブロックしていないか確認"""
    try:
        sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        sock.bind(('localhost', 5550))
        sock.close()
        print("✅ ポート5550: 使用可能")
        return True
    except OSError as e:
        if "Address already in use" in str(e):
            print("⚠️ ポート5550: 既に使用中(別プロセスが使用)")
            return False
        elif "Permission denied" in str(e):
            print("❌ ポート5550: ファイアウォールでブロックされている可能性")
            print("   → Windowsファイアウォール設定を確認してください")
            return False
        else:
            print(f"❌ ポート5550: エラー - {e}")
            return False

# 起動前にチェック
if not check_firewall():
    print("ファイアウォール設定を確認してください。")
    input("Enterキーを押して終了...")
    exit(1)

3. ネットワーク疎通テストの実装#

UDP送信前に接続性を確認:

import socket
import time

def test_udp_connection(host='localhost', port=5550):
    """UDP接続のテスト"""
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sock.settimeout(1.0)

    try:
        # テストメッセージ送信
        sock.sendto(b"TEST", (host, port))
        print(f"✅ UDP送信成功: {host}:{port}")
        return True
    except Exception as e:
        print(f"❌ UDP送信失敗: {e}")
        print("   → ファイアウォール設定を確認してください")
        return False
    finally:
        sock.close()

まとめ#

Windows Firewall UDP通信ブロック問題は、ファイアウォールルールの不在が原因です。

原因:

  • 初回実行時にブロックを選択
  • Python.exeとfgfs.exeの受信・送信ルールが存在しない
  • Windowsファイアウォールのデフォルトブロック

解決策:

  • Windows Firewall詳細設定で受信・送信ルールを作成
  • Python.exeとfgfs.exeの両方にルールを適用
  • netstatでポート使用状況を確認

予防策:

  • READMEにファイアウォール設定手順を記載
  • 起動スクリプトにポート確認機能を追加
  • UDP送信前にネットワーク疎通テストを実施

ファイアウォール設定を正しく行うことで、FlightGear連携が確実に動作します。


関連記事#

  • 【トラブル備忘】FlightGearに機体が表示されない - UDP通信ポート番号不一致(記事E-3)
  • 【トラブル備忘】Socket bind error: Address already in use - ポート重複使用(記事E-18)

© 2025 Yaaasoh. All Rights Reserved.