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

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

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

.NETとは、主に.NET Frameworkと呼ばれるアプリケーションまたは開発環境を指します。CLR(共通言語ランタイム)を搭載し、入力された言語をCIL(共通中間言語)に変換・実行することが可能です。そのため、C#やPythonなど複数の言語を用いることができます。

C#

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

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1481閲覧

C#のSocketについて

syoshinsya-

総合スコア21

.NET

.NETとは、主に.NET Frameworkと呼ばれるアプリケーションまたは開発環境を指します。CLR(共通言語ランタイム)を搭載し、入力された言語をCIL(共通中間言語)に変換・実行することが可能です。そのため、C#やPythonなど複数の言語を用いることができます。

C#

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

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/12/07 17:06

編集2021/12/08 02:21

やりたいこと

以下のpythonコードと同じことをC#でもやりたいのですがうまくいかないので助けていただきたいです。
やっているのはM-SEARCHってやつらしいです。

Python

1import socket 2 3host = '239.255.255.250' 4port = 1900 5messages = "M-SEARCH * HTTP/1.1\r\n" +\ 6 "HOST: 239.255.255.250:1900\r\n" +\ 7 "MX: 5\r\n" +\ 8 "MAN: \"ssdp:discover\"\r\n" +\ 9 "ST: upnp:rootdevice\r\n\r\n\r\n" 10sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 11sock.sendto(messages.encode(), (host, port)) 12while True: 13 try: 14 res = sock.recv(4096) 15 print(res.decode()) 16 except socket.timeout: 17 break 18sock.close()

問題のC#のコード

C#

1Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 2 3 try 4 { 5 IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("239.255.255.250"), 1900); 6 client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 5000); 7 8 string str = 9 "M-SEARCH * HTTP/1.1\r\n" + 10 "HOST: 239.255.255.250:1900\r\n" + 11 "MX: 5\r\n" + 12 "MAN: \"ssdp:discover\"\r\n" + 13 "ST: upnp:rootdevice\r\n"; 14 byte[] q = Encoding.UTF8.GetBytes(str); 15 16 client.SendTo(q, q.Length, SocketFlags.None, endPoint); 17 IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0); 18 EndPoint senderEP = sender; 19 20 List<string> strList = new List<string>(); 21 while (true) 22 { 23 try 24 { 25 byte[] data = new byte[1024]; 26 client.ReceiveFrom(data, ref senderEP); 27 Console.WriteLine(Encoding.UTF8.GetString(data)); 28 } 29 catch(Exception) 30 { 31 break; 32 } 33 } 34 } 35 catch(Exception e) 36 { 37 Console.WriteLine(e.Message); 38 } 39 finally 40 { 41 if (client != null) 42 client.Close(); 43 }

#うまくいっていない部分の説明
こちらがPythonの実行結果です。デバイスが4つ見つかっています。

Python

1HTTP/1.1 200 OK 2CACHE-CONTROL: max-age=120 3Location: http://192.168.0.1:2869/upnp/rootdevice.xml 4SERVER: IGD-HTTP/1.1 UPnP/1.0 UPnP-Device-Host/1.0 5ST: upnp:rootdevice 6EXT: 7 8HTTP/1.1 200 OK 9Location: http://192.168.0.9:49154/MediaRenderer/desc.xml 10Cache-Control: max-age=1800 11Content-Length: 0 12Server: Linux/3.2 UPnP/1.0 Network_Module/1.0 (RX-V485) 13EXT: 14ST: upnp:rootdevice 15 16HTTP/1.1 200 OK 17CACHE-CONTROL: max-age=1800 18DATE: Tue, 07 Dec 2021 14:30:18 GMT 19EXT: 20LOCATION: http://192.168.0.4:60606/***/Server0/ddd 21SERVER: Linux/4.0 UPnP/1.0 Panasonic-UPnP-MW/1.0 22ST: upnp:rootdevice 23 24HTTP/1.1 200 OK 25CACHE-CONTROL: max-age=1800 26DATE: Tue, 07 Dec 2021 14:30:00 GMT 27EXT: 28LOCATION: http://192.168.0.2:38400/***/description.xml 29SERVER: NetBSD/1.6.1, UPnP/1.0, Portable SDK for UPnP devices/1.6.6, DLNADOC/1.50 30ST: upnp:rootdevice 31

こちらはC#の実行結果です。デバイスが2つしか見つけられていません...なぜ...

C#

1HTTP/1.1 200 OK 2CACHE-CONTROL: max-age=120 3Location: http://192.168.0.1:2869/upnp/rootdevice.xml 4SERVER: IGD-HTTP/1.1 UPnP/1.0 UPnP-Device-Host/1.0 5ST: upnp:rootdevice 6EXT: 7 8 9HTTP/1.1 200 OK 10Location: http://192.168.0.9:49154/MediaRenderer/desc.xml 11Cache-Control: max-age=1800 12Content-Length: 0 13Server: Linux/3.2 UPnP/1.0 Network_Module/1.0 (RX-V485) 14EXT: 15ST: upnp:rootdevice

#修正履歴
##2021/12/08
修正前

Python

1messages = "M-SEARCH * HTTP/1.1\r\n" + 2 "HOST: 239.255.255.250:1900\r\n" + 3 "MX: 5\r\n" + 4 "MAN: \"ssdp:discover\"\r\n" + 5 "ST: upnp:rootdevice\r\n";

C#

1string str = 2 "M-SEARCH * HTTP/1.1\r\n" + 3 "HOST: 239.255.255.250:1900\r\n" + 4 "MX: 5\r\n" + 5 "MAN: \"ssdp:discover\"\r\n" + 6 "ST: upnp:rootdevice\r\n"; 7 8while (true) 9 { 10 try 11 { 12 byte[] data = new byte[1024]; 13 client.ReceiveFrom(data, ref senderEP); 14 Console.WriteLine(Encoding.UTF8.GetString(data)); 15 } 16 catch(Exception) 17 { 18 break; 19 } 20 }

修正後

Python

1messages = "M-SEARCH * HTTP/1.1\r\n" +\ 2 "HOST: 239.255.255.250:1900\r\n" +\ 3 "MX: 5\r\n" +\ 4 "MAN: \"ssdp:discover\"\r\n" +\ 5 "ST: upnp:rootdevice\r\n\r\n\r\n"

C#

1string str = 2 "M-SEARCH * HTTP/1.1\r\n" + 3 "HOST: 239.255.255.250:1900\r\n" + 4 "MX: 5\r\n" + 5 "MAN: \"ssdp:discover\"\r\n" + 6 "ST: upnp:rootdevice\r\n\r\n\r\n"; 7 8while (true) 9 { 10 try 11 { 12 byte[] data = new byte[1024]; 13 client.ReceiveFrom(data, ref senderEP); 14 strList.Add(Encoding.UTF8.GetString(data)); 15 Console.WriteLine(Encoding.UTF8.GetString(data)); 16 } 17 catch(SocketException) 18 { 19 break; 20 } 21 }

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/12/07 21:45

目的はなんでしょう? SSDPリフレクター攻撃とか?
dodox86

2021/12/07 22:24

pythonのコードではsocket.timeout で受信ループを抜けるようになっていますがC#の方ではExceptionの捕捉でとにかく抜けるようになっています。その辺りの差では。
dodox86

2021/12/07 23:38

ちなみにご提示のpythonのコードは少なくともpython3.6.9の実行環境ではエラーが起きて動作しませんでした。検証不可なので回答も断念。 ついでに指摘しておきますと、タグの”Socket.IO"はNode.js関係のものなので、本質問には関係ありません。
syoshinsya-

2021/12/08 02:10

質問に返信ありがとうございます。 >目的はなんでしょう? SSDPリフレクター攻撃とか? ローカルネット内にレコーダーがあるので、それから録画情報を持ってきたいって感じです。 >pythonのコードではsocket.timeout で受信ループを抜けるようになっています C#の方もtimeoutのエラーをキャッチするように修正します。 >pythonのコードは少なくともpython3.6.9の実行環境ではエラーが起きて動作しませんでした。 ごめんなさい、こちらにコードを貼る際に古いコードを貼ってしまっていたようです。 修正しておきます >タグの”Socket.IO"はNode.js関係のもの すみません、おすすめタグにあったのでつけてしまっていました。 消しておきます。
guest

回答1

0

自己解決

送信する内容を修正したところ解決しました。修正箇所はstrの最後に開業を二つ入れた部分です
修正前

C#

1string str = 2 "M-SEARCH * HTTP/1.1\r\n" + 3 "HOST: 239.255.255.250:1900\r\n" + 4 "MX: 5\r\n" + 5 "MAN: \"ssdp:discover\"\r\n" + 6 "ST: upnp:rootdevice\r\n";

修正後

C#

1string str = 2 "M-SEARCH * HTTP/1.1\r\n" + 3 "HOST: 239.255.255.250:1900\r\n" + 4 "MX: 5\r\n" + 5 "MAN: \"ssdp:discover\"\r\n" + 6 "ST: upnp:rootdevice\r\n\r\n\r\n";

投稿2021/12/08 13:04

syoshinsya-

総合スコア21

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問