LightSailのインスタンス上でTCPListenerを起動しているのですが、外部から接続することができません。
ローカル接続はPC・LightSail上でできるので、LightSail側のファイアウォールの問題を疑いました。
ですのでLightSailのネットワーキングでファイアウォールをアプリケーション「All TCP+UDP」プロトコル「すべて」ポート範囲「0 - 65535」に変更しました。
また、インスタンス上でWindows Defenderも無効化しています。
それでも接続することができません。
どうすればlightsail上で起動したTCPListenerに接続できるのでしょうか。
・サーバー側::TCPListenerを起動
public static async Task ExeServerTest() { //Listenするポート番号 int port = 6889; //TcpListenerオブジェクトを作成する System.Net.Sockets.TcpListener listener = new System.Net.Sockets.TcpListener(System.Net.IPAddress.IPv6Any, port); //IPv6Onlyを0にする listener.Server.SetSocketOption( System.Net.Sockets.SocketOptionLevel.IPv6, System.Net.Sockets.SocketOptionName.IPv6Only, 0); //Listenを開始する listener.Start(); Console.WriteLine("Listenを開始しました({0}:{1})。", ((System.Net.IPEndPoint)listener.LocalEndpoint).Address, ((System.Net.IPEndPoint)listener.LocalEndpoint).Port); for (; ; ) { using (var tcpClient = await listener.AcceptTcpClientAsync()) { var clientName = "(" + ((System.Net.IPEndPoint)tcpClient.Client.RemoteEndPoint).Address + ":" + ((System.Net.IPEndPoint)tcpClient.Client.RemoteEndPoint).Port + ")"; Console.WriteLine("クライアント" + clientName + "と接続しました。"); using (var stream = tcpClient.GetStream()) { using (var writer = new BinaryWriter(stream)) { //送られてきたバイナリをリード var read = Read(stream); var ret = Encoding.UTF8.GetBytes("クライアントにこの文字列をバイナリにして書き込む"); writer.Write(ret); } } } } }
・クライアント側:サーバーのTCPLisnerに接続
public static async Task ExeClientTest(bool isLocal) { string ipOrHost = isLocal ? //ローカルサーバーに接続する場合 "127.0.0.1" : //lightsailに接続する場合 //***の部分にはlightsailのパブリックipを設定しています "**.***.**.***"; int port = 6889; using (System.Net.Sockets.TcpClient tcp = new System.Net.Sockets.TcpClient(ipOrHost, port)) { Console.WriteLine( "RemoteEndPoint(" + ((System.Net.IPEndPoint)tcp.Client.RemoteEndPoint).Address + ":" + ((System.Net.IPEndPoint)tcp.Client.RemoteEndPoint).Port + ")" + "LocalEndPoint(" + ((System.Net.IPEndPoint)tcp.Client.LocalEndPoint).Address + ":" + ((System.Net.IPEndPoint)tcp.Client.LocalEndPoint).Port + ")"); //NetworkStreamを取得する using (System.Net.Sockets.NetworkStream ns = tcp.GetStream()) { //読み取り、書き込みのタイムアウトを10秒にする const int waitTime = 1000 * 60; ns.ReadTimeout = waitTime; ns.WriteTimeout = waitTime; //サーバーにデータを送信する var sendData = Encoding.UTF8.GetBytes("サーバーにこの文字列をバイナリにして渡す"); await ns.WriteAsync(sendData, 0, sendData.Length).ConfigureAwait(false); //サーバーからの受信まち var buffer = TCPUtil.Read(ns); } } }
・NetworkStreamからReadする処理
static readonly int ReadSplitLineth = 1024 * 1024; public static byte[] Read(NetworkStream stream) { int splitLength = ReadSplitLineth; var resBytes = new byte[splitLength]; using (var ms = new MemoryStream(splitLength)) { int numBytesRead; for (; ; ) { numBytesRead = stream.Read(resBytes, 0, resBytes.Length); if (numBytesRead > 0) { ms.Write(resBytes, 0, numBytesRead); if (numBytesRead == splitLength) { continue; } } break; } return ms.GetBuffer(); } }
あなたの回答
tips
プレビュー