ということで、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 のチャットが必要です。そして、私が最初にしたいのは、インターネットで動作できるようにすることです。後で非同期の問題に対処します。
編集: 「動作していない」ことを明確にしてください....コードの(「接続できません!」)部分をキャッチして通過するという例外がスローされます。