|
分類:[C#]
環境:VisualStudio C# .Net Framework 4.6
System.Net.Sockets.TcpListenerインスタンスから TCPサーバを立て、 System.Net.Sockets.Socketによりクライアント接続し通信するプログラムを作成しています。 片方からデータを送信して、片方からデータを受信するのは簡単ですが、 TCPデータの送受信って ACK、NAK、FIN、SYNがありますよね。
クライアントからサーバへデータを送信すると、WireSharkでパケット分析してみると下記のように出ていました。 1.「[PSH, ACK] データ部」クライアント→サーバ 2.「[ACK]」クライアント←サーバ
この「2.[ACK]」が問題なんですが、別にコーディングしなくても勝手に送信しています。 普段はそれでいいんですが、これをうまくコントロールする必要があって。。。
目標1.データ受信時、ACKを返すタイミングを遅らせたい 目標2.データ受信時、わざと ACKではなく NAKを返したい 目標3.データ送信後、本当に ACKを返してもらったか明確に知りたい 目標4.FINってどうやって受信したか分かる?!
という事が必要です。 下記、現在のTCPデータ送受信コード一部です。
<@サーバー側> var listener = new TcpListener(IPAddress.Any, port); listener.Start(); Socket serverSocket = listener.AcceptSocket();
<Aクライアント側> var clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); clientSocket.Connect(IPAddress.Parse(IPアドレス), ポート);
<Bクライアント送信側スレッド> clientSocket.Send(バイトアレイ); // この時、「[PSH, ACK] データ部」送信 //(目標3 送信後、本当に ACKを返してもらったかクライアントは分かるか?)
<Cサーバー受信側スレッド> var size = serverSocket.Receive(バッファ); // この時、「[ACK]」を返している //(目標1 ACKをどう遅らせるか?) //(目標2 ACKではなくNAKを返すには?)
<Dサーバー側終了(FIN)> serverSocket.Shutdown(SocketShutdown.Both); // この時、「FIN, ACK」を送信。クライアントは「ACK」を返した serverSocket.Close(); //(目標4 クライアントは FIN受信したかをどう分かる?)
という流れが今の実装です。 通信は上手く出来ていますが、それぞれの目標達成方法がまったく知りません。 細かいコントロールは Socketライブラリが勝手にやってくれているんでしょうか。 シミュレータツール開発の機能なので、TCPパケットをユーザーが知る必要はないという言葉では逃げられないんです。
|