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

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

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

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

サーバ

サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

Q&A

解決済

6回答

10136閲覧

【C#】【サーバ】自作した簡易サーバへ、外部からのアクセスができない

defnishbash

総合スコア22

C#

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

サーバ

サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

1グッド

0クリップ

投稿2017/03/07 23:04

編集2017/03/08 02:11

C#でHTTPプロトコルを用いて簡易サーバを作成しようと思ったのですが、
localhostでのアクセスはうまくいくのですが、グローバルIPアドレスを用いてアクセスしようとすると接続してくれません。

コマンドプロンプトで
netsh http add url urlacl url=http://+:90/ user=everyone
と予約して、
ファイアーウォールで新しい規則からTCPの90ポートをこじ開けました。

外部からのアクセスができるようにするためには後どのような手順が必要ですか?

OSはWindows10
サーバーサイドのプログラムは

C#

1using System; 2using System.Threading.Tasks; 3using System.Net; 4using System.IO; 5 6namespace HttpListener 7{ 8 //起動は出力して管理者として実行 9 class Program 10 { 11 public static string root = @"C:\www"; 12 public static void Process(HttpListenerContext context) 13 { 14 HttpListenerRequest req = context.Request; 15 HttpListenerResponse res = context.Response; 16 // リクエストされたURLからファイルのパスを求める 17 string path = root + req.RawUrl.Replace("/", "\\"); 18 // ファイルが存在すればレスポンス・ストリームに書き出す 19 if (File.Exists(path)) 20 { 21 byte[] content = File.ReadAllBytes(path); 22 res.OutputStream.Write(content, 0, content.Length); 23 } 24 res.Close(); 25 } 26 27 static void Main(string[] args) 28 { 29 var listener = new System.Net.HttpListener(); 30 listener.Prefixes.Add("http://*:90/"); 31 listener.Start(); 32 while (true) 33 { 34 HttpListenerContext context = listener.GetContext(); 35 Task.Run(() => Process(context)); 36 } 37 } 38 39 } 40}

追記
プロバイダはKDDIです。
ハード関係にはあまり詳しくないので、何の記述が必要か具体的にお願いします。

もう少しネットインフラについて勉強してからにします。すいませんでした。

firstlast👍を押しています

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

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

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

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

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

Zuishin

2017/03/07 23:40

ルーター他ネット環境はどうなっていますか?
Zuishin

2017/03/08 01:19

質問の意味がわかりませんでしたか?
guest

回答6

0

ルーターについて尋ねたら

ハード関係にはあまり詳しくないので、何の記述が必要か具体的にお願いします。

このような記述が増えましたが、正直サーバーを構築する、あるいは実験するのはやめていただきたい。踏み台になってみんなが迷惑します。

投稿2017/03/08 01:28

Zuishin

総合スコア28656

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

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

0

こんにちは。

ネットワークというのはルータやスイッチなどのハードウェア構成と、そのルーティング設定などのソフトウェア構成の2つが深く結びついて構成されています。よって、ネットワークの構成情報を提供されない限り、正確な回答をすることは不可能です。
仮に、ごく一般的な家庭環境(プロバイダ-<PPPoE>-ブロードバンドルータ-PC)を想定した場合であれば、グローバルIPで接続できないというのは、恐らくはルータ側にNATの変換テーブルを設定していないだけかと思われます。

Zuishinさんの回答に追従しますが、ネットワークについての基礎知識がない状態でパブリックサーバの構築・公開を行うのは、セキュリティ的に非常に危険です。自サーバに侵入されてデータを盗まれる・破壊されるだけならまだしも、そのサーバを踏み台にしてあらゆるネットワークサービスへの攻撃手段として利用されてしまう恐れがあります。ネットワークへの基礎知識とセキュリティに関する基礎知識を理解していない内は、自サーバを公開するのは控えたほうが良いと思います。

投稿2017/03/08 01:47

tamoto

総合スコア4103

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

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

0

自己解決

HttpLisnerを使用せずに、TCPから直接接続してプログラム内で解析してあげることによって外部との接続という目的を達成することが出来ました。

投稿2017/03/11 05:37

defnishbash

総合スコア22

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

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

0

ポート開放をチェックするサービスがあるので一度試してみてください。

Portチェックテスト【外部からのPort開放確認】

他の方も回答されていますが、ルーターのポート設定が必要です。

お手元のルーターの種類と型番を記述ください。

ちなみにルーターというのは↓にあるような箱型の機器です。近くにありませんか?
ルーター

投稿2017/03/08 01:46

clickmaker

総合スコア200

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

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

0

ルーターがあると(そして最近は大体ルーターがありますが)設定なしではインターネットから接続することはできません。

ルーターに他のPCを繋いで試していますか?その場合はローカルのIPを指定して接続すれば繋がりますが。

投稿2017/03/08 01:25

haru666

総合スコア1591

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

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

0

コマンドプロンプトで

netsh http add url urlacl url=http://+90/ user=everyone
と予約して、

http://+90/じゃなくてhttp://+:90/じゃなかったですかね。
ただのTypoかもですが。

HTTPおよびHTTPSの構成

投稿2017/03/08 00:35

kanbeworks

総合スコア829

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

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

defnishbash

2017/03/08 00:43

タイプミスです。 実際にはちゃんとなっています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問