|
分類:[C#]
C#でソケットTCP通信プログラムを作成しています。 以下にさせたい動作とソース例を記載しました。 何か改善策等があればご教授お願い致します。
問題点) ・サーバ、クライアント共にコネクション確立後accept、connectで待機してるが 接続切断時既存のソケットをどのようにcloseさせるか ・現状では送信時に切断が判明する。 ・動作的にはこちらから送信しないと受信しないがタイムアウト後に相手が送信して きた場合 ・他
させたい動作) ・起動時にコネクションを張るスレッドを生成。 ・ボタンを押されると任意のデータを送信する。 ・送信すると相手から応答データを受信する。 ・コネクションは常時張ったまま。
以下当方作成) // 起動時 public void Init() { Thread ThreadNetWork; // サーバー接続の場合 ThreadNetWork = new Thread(new ThreadStart(this.Server)); // クライアント接続の場合 ThreadNetWork = new Thread(new ThreadStart(this.Client)); ThreadNetWork.IsBackground = true; ThreadNetWork.Start(); }
private void Server() { try { IPEndPoint ipEndPoint = new IPEndPoint(GetLocalIpAddress(), networkPort); Socket connectSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); connectSocket.Bind(ipEndPoint); connectSocket.Listen(10); while (true) { networkSocket = connectSocket.Accept(); if (networkCloseFlag) { break; } if (networkSocket.Connected) {
} } connectSocket.Close(); } catch (Exception ex) { } }
private void Client() { while (true) { try { IPEndPoint serverEndPoint = new IPEndPoint(networkIpAddress, networkPort); networkSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); networkSocket.Connect(serverEndPoint); if (networkSocket.Connected) {
} } catch (Exception ex) { // 再接続 Thread.Sleep(ParamEthernet.ReConnectTimeOut * 1000); continue; } } }
// ボタンを押された時にコールされる private bool Command() { // ここで送信処理 NetWork() }
// 通信 private void NetWork() { int bytes = 0; byte[] recvBuff = new byte[NET_BUFF]; try { byte[] sendBuff = Encoding.UTF8.GetBytes(sendData); networkSocket.Send(sendBuff, sendBuff.Length, SocketFlags.None); networkSocket.SetSocketOption( SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, ParamEthernet.TransactionTimeOut * 1000); bytes = networkSocket.Receive(recvBuff, recvBuff.Length, SocketFlags.None); } catch (SocketException ex) { } }
|