DotNetソケット通信

<SockT0001>


2013-2-4 一部修正を行いました (匿名さん連絡ありがとうございます) (v1.01) 。

最終更新 2022-8-11 (v4.01)


(ダウンロードは ↓ 下の方 ↓ にあります)

(参考画面)


1.概要

VB.NETでソケット通信を行うユーザーコントロールです。サンプルレベルです。

IPアドレスによる接続のみ対応です(ホスト名による接続は未対応です)。


2.使い方

ソースの

SockT0001Ctrl.vb

SockT0001Ctrl.resx

SockT0001Ctrl.Designer.vb

をプロジェクトに取り込み、フォーム等に貼り付けて利用します。


3.インタフェース

プロパティ

LocalPort ローカルポート番号

RemotePort リモートポート番号

RemoteIP リモートIPアドレス

BindIP バインドIPアドレス

State 通信状態(=0:切断,=1:接続待ち,=2:通信中)

IPv6Mode IPv6モード(=0:IPv4のみ使用(デフォルト),

=1:IPv6のみ使用,

=2:IPv4とIPv6の両方に対応)

SendBuffSize 送信バッファサイズ(デフォルト値は8192(バイト))

RecvBuffSize 受信バッファサイズ(デフォルト値は8192(バイト))

UseLocalPortForCliConn TCPクライアント時のConnect()で、LocalPortを使用するかどうか

(=False:使用しない(LocalPortは自動割り当てになる)(デフォルト))

(=True:使用する(Close後、同一ポート番号は一定時間使えなくなるため注意))

(通常はデフォルト設定(False)で使用してください)

MulticastTTL マルチキャストTTL設定(デフォルト値は1)

MulticastLOOP マルチキャストループパック設定

(=0:ループバックなし,=1:ループバックあり(デフォルト))


メソッド

Public Sub Open()

UDPでオープンする。

Public Sub Bind()

UDPでバインドする。

Public Overloads Sub SendDataTo(ByVal send_data() As Byte)

UDPでデータを送信する。

Public Overloads Sub SendDataTo(ByVal send_data() As Byte, ByVal send_bytes As Integer)

UDPでデータを送信する(送信バイト数指定あり)。

Public Sub Listen()

TCPサーバで待ち受けする。

Public Sub Accept(ByVal comm_socket As Socket)

TCPサーバで接続要求を受け付ける。

Public Sub Connect()

TCPクライアントで接続要求する。

Public Overloads Sub SendData(ByVal send_data() As Byte)

TCPでデータを送信する。

Public Overloads Sub SendData(ByVal send_data() As Byte, ByVal send_bytes As Integer)

TCPでデータを送信する(送信バイト数指定あり)。

Public Sub Close()

切断する。


イベント

Event Opened(ByVal sender As Object)

UDPでオープンした。

Event Bound(ByVal sender As Object)

UDPでバインドした。

Event StateChanged(ByVal sender As Object)

通信状態が変化した。

Event Listening(ByVal sender As Object)

TCPサーバで待ち受けした。

Event ConnectionRequest(ByVal sender As Object, ByVal comm_socket As Socket)

TCPサーバで接続要求が発生した。

Event Closed(ByVal sender As Object, ByVal disc_state As Integer)

切断した。disc_state=0:自切断,=1:被切断

Event Connected(ByVal sender As Object)

TCPで接続した。

Event Connecting(ByVal sender As Object)

TCPクライアントで接続要求した。

Event DataArrival(ByVal sender As Object, ByVal recv_data() As Byte, ByVal recv_bytes As Integer)

データを受信した。

Event SendProgress(ByVal sender As Object, ByVal send_bytes As Integer)

データを送信中。

Event SendComplete(ByVal sender As Object, ByVal send_bytes As Integer)

データを送信した。

Event Error(ByVal sender As Object, ByVal err_msg As String)

エラーが発生した。


4.その他 ノウハウ等

(1)イベント呼び出しのマルチスレッド対応

.Netのソケット通信ライブラリは、内部的にマルチスレッドとなっているようです。

このため、受信等の通信イベントで フォームの表示を変更しようとすると、

「別のスレッドからアクセスしました」 というようなエラーが発生します。

本ユーザーコントロールでは、イベント発生時に RaiseEventSafe 関数を

かませて BeginInvoke することで、このエラーを回避しています。

( 出典 : http://www.codeproject.com/Articles/21443/Winsock-Revamped )


5.環境

OS : Windows 10 (version 21H2) (64bit)

開発環境 : Visual Studio Community 2019

(v1.07 までは Visual Studio 2010 Pro SP1)

(v2.00 は Visual Studio 2015 Pro)

(v3.00 は Visual Studio Community 2017)

.Net Framework 4.6.2

(v3.00 までは .Net Framework 4 Client Profile)

開発言語 : VB.NET


6.履歴

2012-11-26 v1.00 (初版)

2013-2-4 v1.01 (1)送信バッファサイズを超えた分を捨てないように修正

(匿名さん連絡ありがとうございます)

(2)SendDataToCallback関数のBeginSendToの呼び出しで、

コールバック関数にSendDataCallbackを登録していたミスを修正

(SendDataToCallbackが正しかった)

変更点は「H.H 変更 2013-2-4」で検索可能

2013-2-8 v1.02 (1)非同期送信を同期送信に変更

変更点は「H.H 変更 2013-2-8」で検索可能

2013-2-8 v1.03 (1)0バイトの送信処理変更

変更点は「H.H 変更 2013-2-8」で検索可能

2013-2-16 v1.04 (1)送信データサイズを指定可能にした(メソッドのオーバーロード)

変更点は「H.H 変更 2013-2-16」で検索可能

2013-3-2 v1.05 (1)バッファサイズ設定をソケットにも反映

変更点は「H.H 変更 2013-3-2」で検索可能

2013-3-3 v1.06 (1)バッファサイズ設定をソケットにも反映(Acceptの設定抜け修正)

変更点は「H.H 変更 2013-3-3」で検索可能

2014-6-19 v1.07 コメント修正のみ

2015-11-14 v2.00 IPv6対応(IPv6Modeプロパティを追加)(詳細試験未)

2017-7-23 v3.00 開発環境更新。コメント変更。テスト用画面一部変更(機能変更なし)

2022-8-8 v4.00 開発環境更新。UseLocalPortForCliConnプロパティ追加。

テスト用画面変更(複数行送信対応等)

2022-8-11 v4.01 プログラム見直し(直値の定数化等)。

MulticastTTLとMulticastLOOPプロパティ追加(詳細試験未)

テスト用画面見直し(ログ表示一部変更等)


C#にコンバートしたものも下に置いておきます。


<ダウンロード v4.01

SockT0001Test.zip (2022-8-11)

SockT0001TestCS.zip (2022-8-11)


<旧バージョン v3.00>

SockT0001Test_oldB_v300.zip (2017-7-23)

SockT0001TestCS_oldB_v300.zip (2017-7-23)


<旧バージョン v2.00>

SockT0001Test_oldA_v200.zip (2015-11-14)

SockT0001TestCS_oldA_v200.zip (2015-11-14)


<旧バージョン v1.07>

SockT0001Test_old8_v107.zip (2014-6-20)

SockT0001TestCS_old8_v107.zip (2014-6-19)