0

ということで、LAN内で動く「簡易チャットアプリ」を作ったのですが、LANの外に出ようとすると動きません。私は解決策をネットで検索しており、NAT トラバーサル、ポート転送などの多くのものに出くわしました...どれも役に立ちませんでした。私の質問は: 私のアプリを WAN 経由で動作させるにはどうすればよいですか? 私が望むのは、2 台の PC がインターネット経由で相互に通信すること (1 台はクライアント、もう 1 台はサーバーをシミュレートする) であり、それらの PC は NAT を使用するルーターの背後に隠されていることを理解しています。しかし、アプリを機能させる方法がわかりません。

サーバ:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.Threading;
using System.Net.Sockets;

namespace sukaServer
{
    public partial class Form1 : Form
    {
        Socket sock;
        Socket accept;
        public Form1()
        {
            InitializeComponent();
        }

        Socket socket()
        {
            return new Socket(AddressFamily.InterNetwork, SocketType.Stream,     ProtocolType.Tcp);
    }

    private void buttonListenServ_Click(object sender, EventArgs e)
    {
        sock = socket();
        sock.Bind(new IPEndPoint(0, 80));
        sock.Listen(0);

        new Thread(delegate ()
        {
            accept = sock.Accept();
            MessageBox.Show("CONNECTED!");
            sock.Close();

            while (true)
            {
                try
                {
                    byte[] buffer = new byte[255];
                    int rec = accept.Receive(buffer, 0, buffer.Length, 0);

                    if (rec <= 0)
                    {
                        throw new SocketException();
                    }

                    Array.Resize(ref buffer, rec);

                    Invoke((MethodInvoker)delegate
                    {
                        listBoxServer.Items.Add(Encoding.Default.GetString(buffer));
                    });
                }
                catch
                {
                    MessageBox.Show("DISCONNECTED!");
                    sock.Close();
                    break;
                }
            }
            Environment.Exit(0);
        }).Start();
    }

    private void buttonServerSend_Click(object sender, EventArgs e)
    {
        byte[] data = Encoding.Default.GetBytes(textBoxServerSend.Text);
        accept.Send(data, 0, data.Length, 0);
        textBoxServerSend.Clear();
    }
}
}

クライアント:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;

namespace suka
{
    public partial class Form1 : Form
    {
        Socket sock;
        Socket socket()
        {
        return new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        }
    public Form1()
    {
        InitializeComponent();
        sock = socket();
        FormClosing += new FormClosingEventHandler(Form1_FormClosing);
    }

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        sock.Close();
    }

    private void buttonClientConnect_Click(object sender, EventArgs e)
    {
        try
        {
            sock.Connect(new IPEndPoint(IPAddress.Parse(textBoxClientConnect.Text), 80));
            new Thread(delegate ()
            {
                read();
            }).Start();
        }
        catch
        {
            MessageBox.Show("CANNOT CONNECT!");
        }
    }

    void read()
    {
        while (true)
        {
            try
            {
                byte[] buffer = new byte[255];
                int rec = sock.Receive(buffer, 0, buffer.Length, 0);

                if (rec <= 0)
                {
                    throw new SocketException();
                }

                Array.Resize(ref buffer, rec);

                Invoke((MethodInvoker)delegate
                {
                    listBoxClient.Items.Add(Encoding.Default.GetString(buffer));
                });
            }
            catch
            {
                MessageBox.Show("DISCONNECTED!");
                sock.Close();
                break;
            }
        }
        Environment.Exit(0);
    }


    private void buttonClientSend_Click(object sender, EventArgs e)
    {
        byte[] data = Encoding.Default.GetBytes(textBoxClientSend.Text);
        sock.Send(data, 0, data.Length, 0);
        textBoxClientSend.Clear();
    }
}
}

これは一見重複したようなにおいがすることはわかっていますが、私が見た投稿のどれも、AとBがサーバーを介して通信することを望んでいるか、または他の何かを望んでいるかのいずれかで、同じ正確な問題に対処していません. A がサーバーで B がクライアント、またはその逆の場合に、A と B のチャットが必要です。そして、私が最初にしたいのは、インターネットで動作できるようにすることです。後で非同期の問題に対処します。

編集: 「動作していない」ことを明確にしてください....コードの(「接続できません!」)部分をキャッチして通過するという例外がスローされます。

4

1 に答える 1