質問するログイン新規登録

質問編集履歴

1

コード追加

2016/06/22 03:41

投稿

ryo_se
ryo_se

スコア68

title CHANGED
File without changes
body CHANGED
@@ -18,4 +18,121 @@
18
18
 
19
19
  3に関しては、上記状態になった際に電文受信待機でブロッキングされていることから、再度接続待機が行えない状態になっているのだと思います。
20
20
 
21
- 3つの実現に対し、サンプルやご教示をいただければ幸いです。
21
+ 3つの実現に対し、サンプルやご教示をいただければ幸いです。
22
+
23
+ 【追記】
24
+ 複数クライアントの接続について、下記サイトを参考にしてコーディングしてみました。
25
+ https://codezine.jp/article/detail/22
26
+
27
+ 上記サイトのサンプルではクライアントと接続ができたら即座にクローズしていますが、
28
+ 今回は接続中のままとしています。
29
+
30
+ ところが接続中の複数のクライアントを管理、電文を送信するために、接続したSocketインスタンスをListに入れて保存という形をとってみましたが、一定時間毎にListにSocketインスタンスが追加されていってしまいます。
31
+
32
+ そもそも複数のクライアントを管理する上で正しい方法がわからず、ご教示をいただきたいです。
33
+
34
+ ```ここに言語を入力
35
+
36
+ private Socket ServerSocket = null;
37
+ private System.Net.IPEndPoint EndPointHost = null; //エンドポイント
38
+ private List<Socket> ConnectSocketArray = new List<Socket>();
39
+
40
+ public Form1()
41
+ {
42
+ InitializeComponent();
43
+ }
44
+
45
+ private void Form1_Load(object sender, EventArgs e)
46
+ {
47
+
48
+ }
49
+
50
+ //クライアントの接続待ちスタート
51
+ private void StartAccept(System.Net.Sockets.Socket server)
52
+ {
53
+ //接続要求待機を開始する
54
+ server.BeginAccept(
55
+ new System.AsyncCallback(AcceptCallback), server);
56
+ }
57
+
58
+ //BeginAcceptのコールバック
59
+ private void AcceptCallback(System.IAsyncResult ar)
60
+ {
61
+ //サーバーSocketの取得
62
+ System.Net.Sockets.Socket server =
63
+ (System.Net.Sockets.Socket)ar.AsyncState;
64
+
65
+ //接続要求を受け入れる
66
+ System.Net.Sockets.Socket client = null;
67
+ try
68
+ {
69
+ //クライアントSocketの取得
70
+ client = server.EndAccept(ar);
71
+ }
72
+ catch
73
+ {
74
+ System.Console.WriteLine("閉じました。");
75
+ return;
76
+ }
77
+
78
+ //クライアントが接続した時の処理をここに書く
79
+ //ここでは文字列を送信して、すぐに閉じている
80
+ client.Send(System.Text.Encoding.UTF8.GetBytes("こんにちは。"));
81
+ //client.Shutdown(System.Net.Sockets.SocketShutdown.Both);
82
+ //client.Close();
83
+ ConnectSocketArray.Add(client);
84
+
85
+ foreach (Socket cl in ConnectSocketArray)
86
+ {
87
+ Console.WriteLine(cl.ToString());
88
+ }
89
+ Console.WriteLine(ConnectSocketArray.Count());
90
+
91
+ //接続要求待機を再開する
92
+ server.BeginAccept(
93
+ new System.AsyncCallback(AcceptCallback), server);
94
+ }
95
+
96
+ private void button1_Click(object sender, EventArgs e)
97
+ {
98
+ // Socket の生成
99
+ ServerSocket = new Socket(
100
+ AddressFamily.InterNetwork, // IP version 4 のアドレス
101
+ SocketType.Stream, // 通信方式をバイトストリーム
102
+ ProtocolType.Tcp); // プロトコルをTCP
103
+
104
+ // EndPointHostがnullならば、ホストのIPアドレスとポート番号の指定
105
+ if (EndPointHost == null)
106
+ {
107
+
108
+ EndPointHost = new System.Net.IPEndPoint(System.Net.IPAddress.Parse("127.0.0.1"), 10002);
109
+ }
110
+
111
+ // ローカル エンドポイント(IPアドレス等の情報)と関連付け
112
+ ServerSocket.Bind(EndPointHost);
113
+ // 電文取り出しの接続がまだ保留中におけるキューの最大長
114
+ ServerSocket.Listen(100);
115
+
116
+ StartAccept(ServerSocket);
117
+ Console.WriteLine("待機状態になりました");
118
+ }
119
+
120
+ private void button2_Click(object sender, EventArgs e)
121
+ {
122
+ ServerSocket.Shutdown(SocketShutdown.Both);
123
+ ServerSocket.Close();
124
+ ServerSocket= null;
125
+ Console.WriteLine("待機状態終了しました");
126
+
127
+ }
128
+
129
+ //テキストボックスの内容を送信する
130
+ private void button3_Click(object sender, EventArgs e)
131
+ {
132
+ string data = textBox1.Text;
133
+ foreach(Socket client in ConnectSocketArray){
134
+ client.Send(System.Text.Encoding.UTF8.GetBytes(data));
135
+ }
136
+
137
+ }
138
+ ```