質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

0回答

1133閲覧

AWSのLightsailで起動したTcpListenerに外部から接続できない

yonotsui

総合スコア28

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

1クリップ

投稿2020/04/25 12:38

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(); } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問