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

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

新規登録して質問してみよう
ただいま回答率
85.50%
ソケット

TCP/IPにおいて、IPアドレスとサブアドレスであるポート番号を組み合わせたネットワークアドレスのことを呼びます。また、ソフトウェアアプリケーションにおいて、TCP/IP通信を行う為の仮想的なインターフェースという意味もある。

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

3920閲覧

1対1のTCP通信画面を一つのソフト内で複数作成

abanda

総合スコア12

ソケット

TCP/IPにおいて、IPアドレスとサブアドレスであるポート番号を組み合わせたネットワークアドレスのことを呼びます。また、ソフトウェアアプリケーションにおいて、TCP/IP通信を行う為の仮想的なインターフェースという意味もある。

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2017/03/12 07:55

いつもお世話になっております。

今回はある動作でSocektExceptionが発生する為、その対処法についてお聞きしようと質問しました。

やりたい事は1対1のTCP通信画面を一つのソフトの中で複数作り、共通する返信・設定は設定画面一つで賄おうとしており、個別の設定値については通信画面一つ一つで決めれるような形にしようと考えています。(該当箇所:ラジオボタン[A,B,C,D])

ServerFormが通信、返信をする画面です。この画面のインスタンスを複数作れば1対1の接続を同時にいくつも行う場合、共通の設定を共有できるのではないかと考えていたのですが、ServerForm画面を複数呼び出し、Startボタンを二つ以上押したところで、SocektExceptionが発生してしまいます。

このエラーがなぜ発生するのかいまいちわかっておりません。どなたかご教授できればと思います。また、こういう形にすれば複数画面でTCP通信が可能になるとヒントでも貰えればと思います。

前回質問同様、ソースコードを添付いたしますので、お手数お掛けしますがそちらを参照していたければ幸いです。
リンク内容(PASSWORD:今年の西暦4桁を数字で)

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

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

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

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

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

guest

回答1

0

ベストアンサー

サーバ側で同一のポートで待ち受けしようとしてSocketExceptionが発生しています。

VB.NET

1 'サーバーの接続の確立 2 Public Function ServerStart() As Boolean 3 4 'ListenするIPアドレス 5 Dim IP As System.Net.IPAddress 6 7 'サーバーのIPアドレス(または、ホスト名)とポート番号をテキストボックスから取得 8 IpAdress = ServerForm.textBoxIp.text 9 IP = System.Net.IPAddress.Parse(IpAdress) 10 Port = Integer.Parse(ServerForm.textBoxPortNo.Text) 11 12 'TcpListenerを使用してサーバーの接続の確立 13 Try 14 'lisenerが無い場合 15 If listener Is Nothing Then 16 'TcpListenerオブジェクトを作成する 17 listener = New TcpListener(IP, Port) 18 End If 19 20 'Listenを開始 = クライアント接続要求の受付開始 21 listener.Start() ’ここでSocketExceptionが発生 22 23 'ログの書き込み 24 RaiseEvent WriteLog(DateTime.Now.ToString() & Space(1) & "サーバを開始しました。") 25 26 'スレッドの作成と開始 27 threadServer = New Thread(New ThreadStart(AddressOf ServerListen)) 28 threadServer.Start() 29 Return True 30 31 Catch ex As Exception 32 'エラーが起きた場合 33 RaiseEvent WriteLog("サーバ接続エラー:" & ex.Message.ToString()) 34 listener.Stop() 35 RaiseEvent ChangeIndicator(Color.Navy) 36 Return False 37 End Try 38 End Function 39

原因としては待ち受けポートを設定する際

VB.NET

1 Port = Integer.Parse(ServerForm.textBoxPortNo.Text)

とA~Dどの画面から呼ばれる場合でも同一のフォームのtextBoxPortNo.Textを参照していて画面側で
いくらポートを変更していても同じ値になってしまっています。

せっかくプロパティとして作成しているのですからTCPクラスからポートの値を取りに行くのではなく

VB.NET

1 'ソケット通信開始 2 Private Sub StartSock() 3 '接続確認フラグ 4 Dim OpenFlg As Boolean 5 6 TCP.Port = Integer.Parse(Me.textBoxPortNo.Text) 7 OpenFlg = TCP.ServerStart() 8 9 If OpenFlg Then 10 StartServerbtn.Enabled = False 11 StopServerbtn.Enabled = True 12 End If 13 14 End Sub

と画面の方でTCPクラスのプロパティをセットすべきです。

投稿2017/03/12 09:05

YAmaGNZ

総合スコア10222

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

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

abanda

2017/03/12 11:40

いつも回答ありがとうございます! 画面側で変更しても同じポートを待ち受けるようになっていたとは全く気づきませんでした。 いつも大変勉強にさせてもらっております。 今後も何かあればよろしくお願いします。それではありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問