Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 8271079
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: June 8, 20262026-06-08T06:45:18+00:00 2026-06-08T06:45:18+00:00

I am attempting to utilize MSDN’s Asynchronous Client Socket code sample to connect and

  • 0

I am attempting to utilize MSDN’s Asynchronous Client Socket code sample to connect and control some home equipment. As I understand, the sample code’s ReceiveCallback method uses an instance of the EventWaitHandle ManualResetEvent and the method receiveDone.WaitOne() to hold processing of the current thread until the thread receives a signal that all of the socket’s data has been transmitted from the remote device. After all of the socket’s data has been transmitted (the socket’s data is empty and bytesRead = 0), the Waithandle is removed and the application continues processing.

Unfortunately, by stepping-through the execution of the code, it appears that after the last time that the client returns data from the remote device, ReceiveCallback never returns to see if the data-queue is empty (i.e. bytesRead = 0), and thus never enters the “else” condition in ReceiveCallback where the state of the ManualResetEvent would have been reset and the application would have continued to process. Thus, since it never enters the “else” condition, ManualResetEvent is never reset and the application freezes.

Although I can remove the “receiveDone.WaitOne()” method from the code – permitting execution without waiting for the ManualResetEvent’s notification that all of the data has been received; this returns a data-string from the equipment that is typically incomplete.

Am I using this code sample incorrectly? Has anyone seen this before or had any experience on how to work-around this issue?

7/14/2012 – UPDATE: After further testing of the MSDN’s Asynchronous Client Socket Example, it became clear that ReceiveCallback actually re-polls the port and the “bytesRead = 0” condition is satisfied only when the socket is released (i.e. client.Shutdown(SocketShutdown.Both); client.Close(); ). If I understand this correctly, this means that the connection has to be closed to get past the receiveDone.WaitOne() method. If the connection is closed to satisfy the WaitOne() Waithandle, it totally defeats the purpose of the application in that I had been hoping to leave the connection open so that the application could listen for equipment updates, which happen continually.

7/16/2012 – UPDATE: I have written to Microsoft Tech Support who have responded that “We’re doing research on this issue. It might take some time before we get back to you.” As such, it seems that it doesn’t appear that this challenge can be resolved at this time through massaging this code.

Without the availability of the Asynchronous Client Socket example code as a foundation for writing asynchronous communication procedures, may I ask if anyone can please suggest a replacement routine that is more reliable? There are three pieces of equipment, each with it’s own ip-address and port number. Thus, it would be ideal if a class could be utilized, where an instance could be created for each device. Additionally, the port must remain open to receive spontaneous updates continually sent by the equipment. Lastly, the updates do not have a end character or defined length signalling that the transmission of the message is complete, thus the routine must continually poll the port for available data. Any advice or suggestions would be greatly appreciated.

7/18/2012 – WORKAROUND: After spending a considerable amount of time attempting to get the MSDN’s Asynchronous Client Socket code sample working, it became clear that I would have to look elsewhere to get the device responses continuously recognized by the program. In the hope to save someone else the brain-damage, I have included the work-around that I used which seems to work well to this point. If anyone has any suggestions, please don’t hesitate to add to this question!

// 
// ORIGINAL CODE ATTEMPT
//
public static Socket LutronClient;
public static String LutronResponse = String.Empty;
private const int LutronPort = 4999;
private const string LutronIP = "192.168.1.71";
private static ManualResetEvent LutronConnectDone = new ManualResetEvent(false);
private static ManualResetEvent LutronSendDone = new ManualResetEvent(false);
private static ManualResetEvent LutronReceiveDone = new ManualResetEvent(false);

private static void StartLutronClient()
    {
        try
        {
            var lutronIPAddress = IPAddress.Parse(LutronIP);
            var lutronRemoteEP = new IPEndPoint(lutronIPAddress, LutronPort);
            LutronClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            LutronClient.BeginConnect(lutronRemoteEP, LutronConnectCallback, LutronClient);
            LutronConnectDone.WaitOne();

            LutronSend(LutronClient, "sdl,14,100,0,S2\x0d");
            LutronSendDone.WaitOne();
            LutronReceive(LutronClient);
            LutronReceiveDone.WaitOne(new TimeSpan(5000));
            MessageBox.Show("Response received from Lutron: " + LutronResponse);
            txtBoxLutron.Text = LutronResponse;

            LutronClient.Shutdown(SocketShutdown.Both);
            LutronClient.Close();
        }
        catch (Exception e) { MessageBox.Show(e.ToString()); }
    }

    private static void LutronConnectCallback(IAsyncResult lutronAr)
    {
        try
        {
            var lutronClient = (Socket)lutronAr.AsyncState;
            lutronClient.EndConnect(lutronAr);
            LutronConnectDone.Set();
        }
        catch (Exception e) { MessageBox.Show(e.ToString()); }
    }

    private static void LutronReceive(Socket lutronClient)
    {
        try
        {
            var lutronState = new LutronStateObject { LutronWorkSocket = lutronClient };
            lutronClient.BeginReceive(lutronState.LutronBuffer, 0, LutronStateObject.BufferSize, 0, new AsyncCallback(LutronReceiveCallback), lutronState);
        }
        catch (Exception e) { MessageBox.Show(e.ToString()); }
    }

    private static void LutronReceiveCallback(IAsyncResult lutronAR)
    {
        try
        {
            var lutronState = (LutronStateObject)lutronAR.AsyncState;
            var lutronClient = lutronState.LutronWorkSocket;
            var bytesRead = lutronClient.EndReceive(lutronAR);
            if (bytesRead > 0)
            {
                lutronState.LutronStringBuilder.AppendLine(Encoding.ASCII.GetString(lutronState.LutronBuffer, 0, bytesRead));
                lutronClient.BeginReceive(lutronState.LutronBuffer, 0, LutronStateObject.BufferSize, 0, new AsyncCallback(LutronReceiveCallback), lutronState);
            }
            else
            {
                if (lutronState.LutronStringBuilder.Length > 0) { LutronResponse = lutronState.LutronStringBuilder.ToString(); }
                LutronReceiveDone.Set();
            }
        }
        catch (Exception e) { MessageBox.Show(e.ToString()); }
    }

    public static void LutronSend(Socket client, String data)
    {
        var byteData = Encoding.ASCII.GetBytes(data);
        client.BeginSend(byteData, 0, byteData.Length, 0, LutronSendCallback, client);
    }

    private static void LutronSendCallback(IAsyncResult ar)
    {
        try
        {
            var client = (Socket)ar.AsyncState;
            var bytesSent = client.EndSend(ar);
            LutronSendDone.Set();
        }
        catch (Exception e) { MessageBox.Show(e.ToString()); }
    }
    public class LutronStateObject
    {
        public Socket LutronWorkSocket;
        public const int BufferSize = 256;
        public byte[] LutronBuffer = new byte[BufferSize];
        public StringBuilder LutronStringBuilder = new StringBuilder();
    }

}

This is the work-around I used:

 //
 // WORK-AROUND
 //
 using System;
 using System.Windows.Forms;

 namespace _GlobalCacheInterface
 {
     public partial class GlobalCacheDataScreen : Form
     {

         //Interface objects
         private static GC_Interface _lutronInterface;
         private const int LutronPort = 4999;
         private const string LutronIP = "192.168.1.71";
         delegate void ThreadSafeLutronCallback(string text);

         private static GC_Interface _elanInterface;
         private const int ElanPort = 4998;
         private const string ElanIP = "192.168.1.70";
         delegate void ThreadSafeElanCallback(string text);

         private static GC_Interface _tuneSuiteInterface;
         private const int TuneSuitePort = 5000;
         private const string TuneSuiteIP = "192.168.1.70";
         delegate void ThreadSafeTuneSuiteCallback(string text);

         public GlobalCacheDataScreen()
         {
              InitializeComponent();

              _lutronInterface = new GC_Interface(LutronIP, LutronPort);
              _elanInterface = new GC_Interface(ElanIP, ElanPort);
              _tuneSuiteInterface = new GC_Interface(TuneSuiteIP, TuneSuitePort);

             // Create event handlers to notify application of available updated information.
             _lutronInterface.DataAvailable += (s, e) => ThreadSafeTxtBoxLutron(_lutronInterface._returnString);
             _elanInterface.DataAvailable += (s, e) => ThreadSafeTxtBoxElan(_elanInterface._returnString);
             _tuneSuiteInterface.DataAvailable += (s, e) => ThreadSafeTxtBoxTuneSuite(_tuneSuiteInterface._returnString);
             _lutronInterface.Connected += (s, e) => UpdateUI();
             _elanInterface.Connected += (s, e) => UpdateUI();
             _tuneSuiteInterface.Connected += (s, e) => UpdateUI();

             UpdateUI();
         }

         private void UpdateUI()
         {
             _buttonConnectToLutron.Enabled = !_lutronInterface._isConnected;
             _buttonConnectToElan.Enabled = !_elanInterface._isConnected;
             _buttonConnectToTuneSuite.Enabled = !_tuneSuiteInterface._isConnected;
             _buttonDisconnectFromLutron.Enabled = _lutronInterface._isConnected;
             _buttonDisconnectFromElan.Enabled = _elanInterface._isConnected;
             _buttonDisconnectFromTuneSuite.Enabled = _tuneSuiteInterface._isConnected;
             string connectLutronStatus = _lutronInterface._isConnected ? "Connected" : "Not Connected";
             string connectElanStatus = _elanInterface._isConnected ? "Connected" : "Not Connected";
             string connectTuneSuiteStatus = _tuneSuiteInterface._isConnected ? "Connected" : "Not Connected";
             _textBoxLutronConnectStatus.Text = connectLutronStatus;
             _textBoxElanConnectStatus.Text = connectElanStatus;
             _textBoxTuneSuiteConnectStatus.Text = connectTuneSuiteStatus;
         }


         private void ThreadSafeTxtBoxLutron(string message) { if (_lutronRichTextRxMessage.InvokeRequired) { var d = new ThreadSafeLutronCallback(ThreadSafeTxtBoxLutron); _lutronRichTextRxMessage.Invoke(d, new object[] { message }); } else { _lutronRichTextRxMessage.Text = message; } }     
         private void ThreadSafeTxtBoxElan(string message) { if (_elanRichTextRxMessage.InvokeRequired) { var d = new ThreadSafeElanCallback(ThreadSafeTxtBoxElan); _elanRichTextRxMessage.Invoke(d, new object[] { message }); } else { _elanRichTextRxMessage.Text = message; if (message.EndsWith("\r")) { MessageBoxEx.Show(message, "Message from Lutron Elan", 1000); } } }
         private void ThreadSafeTxtBoxTuneSuite(string message) { if (_tuneSuiteRichTextRxMessage.InvokeRequired) { var d = new ThreadSafeTuneSuiteCallback(ThreadSafeTxtBoxTuneSuite); _tuneSuiteRichTextRxMessage.Invoke(d, new object[] { message }); } else { _tuneSuiteRichTextRxMessage.Text = message; if (message.EndsWith("\r")) { MessageBoxEx.Show(message, "Message from TuneSuite", 1000); } } }

         private void _buttonConnectToLutron_Click(object sender, EventArgs e) { _lutronInterface.Connect(); }
         private void _buttonDisconnectFromLutron_Click(object sender, EventArgs e) { _lutronInterface.Disconnect(); }
         private void _buttonConnectToElan_Click(object sender, EventArgs e) { _elanInterface.Connect(); }
         private void _buttonDisconnectFromElan_Click(object sender, EventArgs e) { _elanInterface.Disconnect(); }
         private void _buttonConnectToTuneSuite_Click(object sender, EventArgs e) { _tuneSuiteInterface.Connect(); }
         private void _buttonDisconnectFromTuneSuite_Click(object sender, EventArgs e) { _tuneSuiteInterface.Disconnect(); }
         private void _buttonLutronSendMessage_Click(object sender, EventArgs e) { _lutronInterface.SendCommand(_lutronRichTextTxMessage.Text); }
         private void _buttonElanSendMessage_Click(object sender, EventArgs e) { _elanInterface.SendCommand(_elanRichTextTxMessage.Text); }
         private void _buttonTuneSuiteSendMessage_Click(object sender, EventArgs e) { _tuneSuiteInterface.SendCommand(_elanRichTextTxMessage.Text); }
         private void _buttonLightOn_Click(object sender, EventArgs e) { _lutronInterface.SendCommand("sdl,14,100,0,S2"); }
         private void _buttonLightOff_Click(object sender, EventArgs e) { _lutronInterface.SendCommand("sdl,14,0,0,S2"); }
         private void _buttonStereoOnOff_Click(object sender, EventArgs e) { _elanInterface.SendCommand("sendir,4:3,1,40000,4,1,21,181,21,181,21,181,21,181,21,181,21,181,21,181,21,181,21,181,21,181,21,181,21,800"); }
         private void _button30_Click(object sender, EventArgs e) { _tuneSuiteInterface.SendCommand("\xB8\x4D\xB5\x33\x30\x00\x30\x21\xB8"); }
         private void _button31_Click(object sender, EventArgs e) { _tuneSuiteInterface.SendCommand("\xB8\x4D\xB5\x33\x31\x00\x30\x21\xB8"); }
         private void _button26_Click(object sender, EventArgs e) { _tuneSuiteInterface.SendCommand("\xB8\x4D\xB5\x32\x36\x00\x30\x21\xB8"); }
     }
 }

and the GC_Interface class:

 using System;
 using System.Net;
 using System.Net.Sockets;
 using System.Text;
 using System.Windows.Forms;

 namespace _GlobalCacheInterface
 {
     class GC_Interface
     {
         // Declare an event handler to notify when updates are available.
         public event EventHandler<EventArgs> DataAvailable;
         public string _returnString = "";

         // Declare an event handler to notify status of connection.
         public event EventHandler<EventArgs> Connected;
         public bool _isConnected;

         public AsyncCallback ReceiveCallback;
         public Socket Client;
         private string _ipAddress;
         private int _port;
         private bool _waitForEndCharacter;
         private byte _endCharacter;
         byte[] m_DataBuffer = new byte[10];
         IAsyncResult m_Result;

         public GC_Interface(string ipAddress, int port) { Init(ipAddress, port, false, 0); }

         private void Init(string ipAddress, int port, bool waitForEndCharacter, byte endCharacter)
         {
             _ipAddress = ipAddress;
             _port = port;
             _waitForEndCharacter = waitForEndCharacter;
             _endCharacter = endCharacter;
             _isConnected = false;
         }

         public bool Connect()
         {
             try
             {
                 // Create a TCP/IP socket.
                 Client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

                 // Establish the remote endpoint for the socket.
                 var address = IPAddress.Parse(_ipAddress);
                 var remoteEP = new IPEndPoint(address, _port);

                 // Connect to the remote endpoint.
                 Client.Connect(remoteEP);
                 if (Client.Connected)
                 {
                     _isConnected = true;
                     ConnectedEventHandler();
                     WaitForData();
                 }
                 return true;
             }
             catch (SocketException se) { MessageBox.Show("\n connection failed, is the server running?\n" + se.Message ); return false; }
         }
         public bool SendCommand(string command)
         {
             try
             {
                 // Convert the string data to byte data using ASCII encoding.
                 var byteData = Encoding.Default.GetBytes(command);
                 // Add a carraige-return to the end.  
                 var newArray = new byte[byteData.Length + 1];
                 byteData.CopyTo(newArray, 0);
                 newArray[newArray.Length - 1] = 13;
                 if (Client == null) { return false; }
                 Client.Send(newArray);
                 return true;
             }
             catch (SocketException se) {  MessageBox.Show(se.Message); return false;  }
         }
         public void WaitForData()
         {
             try
             {
                 if (ReceiveCallback == null) { ReceiveCallback = new AsyncCallback(OnDataReceived); }
                 var theSocPkt = new SocketPacket { thisSocket = Client };
                 m_Result = Client.BeginReceive(theSocPkt.DataBuffer, 0, theSocPkt.DataBuffer.Length, SocketFlags.None, ReceiveCallback, theSocPkt);
             }
             catch (SocketException se) { MessageBox.Show(se.Message); }
         }
         public class SocketPacket
         {
             public System.Net.Sockets.Socket thisSocket;
             public byte[] DataBuffer = new byte[1];
         }
         public void OnDataReceived(IAsyncResult asyn)
         {
             try
             {
                  SocketPacket theSockId = (SocketPacket)asyn.AsyncState;
                 var iRx = theSockId.thisSocket.EndReceive(asyn);
                 char[] Chars = new char[iRx + 1];
                 System.Text.Decoder d = System.Text.Encoding.UTF8.GetDecoder();
                 int CharLen = d.GetChars(theSockId.DataBuffer, 0, iRx, Chars, 0);
                 System.String szData = new System.String(Chars);
                 _returnString = _returnString + szData.Replace("\0", "");
                 // When an update is received, raise DataAvailable event
                 DataAvailableEventHandler();
                 WaitForData();
             }
             catch (ObjectDisposedException) { System.Diagnostics.Debugger.Log(0, "1", "\nOnDataReceived: Socket has been closed\n"); }
             catch (SocketException se) { MessageBox.Show(se.Message); }
         }
         public bool Disconnect()
         {
              try
              {
                  if (Client == null) { return false; }
                  Client.Close(); 
                  Client = null;
                  _isConnected = false;
                  return true;
              }
              catch (Exception) { return false; }
         }
         protected virtual void DataAvailableEventHandler()
         {
             var handler = DataAvailable;
             if (handler != null) { handler(this, EventArgs.Empty); }
         }
         protected virtual void ConnectedEventHandler()
         {
             var handler = Connected;
             if (handler != null) { handler(this, EventArgs.Empty); }
         }

     }
 }
  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-06-08T06:45:20+00:00Added an answer on June 8, 2026 at 6:45 am

    I had the same issue, adding an Available check to the code fixed my problem. Below is the revised code.

    private static void ReceiveCallback( IAsyncResult ar ) {
            try {
                StateObject state = (StateObject) ar.AsyncState;
                Socket client = state.workSocket;
    
                int bytesRead = client.EndReceive(ar);
                if (bytesRead > 0) {
                    state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead));
                    // Check if there is anymore data on the socket
                    if (client.Available > 0) {
                        client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state);
                    }
                }
    
                if (bytesRead == 0 || client.Available == 0) {
                    if (state.sb.Length > 1) {
                        response = state.sb.ToString();
                    }
                    receiveDone.Set();
                }
            } catch (Exception e) {
                Console.WriteLine(e.ToString());
            }
        }
    

    Hope that helps.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I'm attempting to utilize some code found here: http://androidtabs.googlecode.com/svn/trunk/ This includes the bases classes
I'm attempting to utilize the socket.h functions within Windows. Essentially, I'm currently looking at
Im attempting to utilize some custom script and css files within an asp page.
I am attempting to compile/run a sample WCF application from Juval Lowy's website (author
I have been attempting to compile/run a sample WCF application from Juval Lowy's website
I'm attempting to utilize a 3rd-party PHP library in a semi-developed web project. Unfortunately,
So I'm attempting to configure a WCF 4 REST app to utilize multiple standard
I've been attempting to utilize the plurals resource with Android but have not had
Attempting to follow the directions as specified on http://code.google.com/p/gears/wiki/BuildingGearsForWindows my attempts are failing at
So I'm attempting to utilize a generic compare functor in my utility class. I

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.