From 1ed06b53dfdd7a7165be6e703ffa05d069479cf5 Mon Sep 17 00:00:00 2001 From: Jacob Barthelmeh Date: Wed, 28 Sep 2016 15:00:30 -0600 Subject: [PATCH] C# Wrapper : TCP check connection termination --- wrapper/CSharp/wolfSSL_CSharp/wolfSSL.cs | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/wrapper/CSharp/wolfSSL_CSharp/wolfSSL.cs b/wrapper/CSharp/wolfSSL_CSharp/wolfSSL.cs index 5b3b46e2c..c87288f87 100644 --- a/wrapper/CSharp/wolfSSL_CSharp/wolfSSL.cs +++ b/wrapper/CSharp/wolfSSL_CSharp/wolfSSL.cs @@ -32,6 +32,9 @@ namespace wolfSSL.CSharp { { private const string wolfssl_dll = "wolfssl.dll"; + /* wait for 6 seconds default on TCP socket state poll if timeout not set */ + private const int WC_WAIT = 6000000; + /******************************** * Class for DTLS connections */ @@ -336,9 +339,17 @@ namespace wolfSSL.CSharp { System.Runtime.InteropServices.GCHandle gch; gch = GCHandle.FromIntPtr(ctx); Socket con = (System.Net.Sockets.Socket)gch.Target; - Byte[] msg = new Byte[sz]; amtRecv = con.Receive(msg, msg.Length, 0); + if (amtRecv == 0) + { + /* No data received so check for a response to see if connection is still open */ + if (con.Poll((con.ReceiveTimeout > 0) ? con.ReceiveTimeout : WC_WAIT, SelectMode.SelectRead)) + { + log(ERROR_LOG, "socket connection issue, suspected connection termination."); + return wolfssl.CBIO_ERR_CONN_CLOSE; + } + } Marshal.Copy(msg, 0, buf, sz); } catch (Exception e) @@ -373,10 +384,17 @@ namespace wolfSSL.CSharp { gch = GCHandle.FromIntPtr(ctx); Socket con = (System.Net.Sockets.Socket)gch.Target; - Byte[] msg = new Byte[sz]; Marshal.Copy(buf, msg, 0, sz); - con.Send(msg, 0, msg.Length, SocketFlags.None); + if (con.Send(msg, 0, msg.Length, SocketFlags.None) == 0 && sz !=0) + { + /* no data sent and msg size is larger then 0, check for lost connection */ + if (con.Poll((con.SendTimeout > 0) ? con.SendTimeout : WC_WAIT, SelectMode.SelectWrite)) + { + log(ERROR_LOG, "socket connection issue, suspect connection termination"); + return wolfssl.CBIO_ERR_CONN_CLOSE; + } + } return sz; } catch (Exception e)