title: A request to send or receive data was disallowed because the socket is not connected (only if I connect 2nd time)
body: <p>I have a big problem understanding c# tcp async client program! I have written next code (mostly from microsoft developer network, I only changed console.writeline to lambda expressions for my WPF app), and problem here is that I get error "a request to send or receive data was disallowed because the socket is not connected and (when sending on datagram socket using a send to call) no address was supplied"!</p>
  
  <p><br>
  I don't mind if the app would show me the message the first time I connect to server, but this error occurs when I connect for the 2nd time. <strong>It says I I haven't supplied address, but why did it work the first time but not the second time, when I connect with same address?</strong></p>
  
  <p>PS: I don't think the problem is in server app because I checked everything (identical to MSDN site)!</p>
  
  <p>CODE:
  <br></p>
  
  <pre><code>    // State object for receiving data from remote device.
      public class StateObject {
      // Client socket.
      public Socket workSocket = null;
      // Size of receive buffer.
      public const int BufferSize = 256;
      // Receive buffer.
      public byte[] buffer = new byte[BufferSize];
      // Received data string.
      public StringBuilder sb = new StringBuilder();
  }
  
  public class AsynchronousClient
  {
      // The port number for the remote device.
      private static int port;
      private static IPAddress ipAd;
      public static TextBlock statusPanel;
  
      // ManualResetEvent instances signal completion.
      private static ManualResetEvent connectDone =
          new ManualResetEvent(false);
      private static ManualResetEvent sendDone =
          new ManualResetEvent(false);
      private static ManualResetEvent receiveDone =
          new ManualResetEvent(false);
  
      // The response from the remote device.
      private static String response = String.Empty;
  
      public static void setPort(int portt)
      {
          port = portt;
      }
  
      public static void setIpAddress(string ip)
      {
          ipAd = IPAddress.Parse(ip);
      }
  
      public static void setStatusPanel(TextBlock status)
      {
          statusPanel = status;
      }          
  
      public static void StartClient(string message)
      {
          // Connect to a remote device.
          try
          {
              // Establish the remote endpoint for the socket.
              IPAddress ipAddress = ipAd;
              IPEndPoint remoteEP = new IPEndPoint(ipAddress, port);
  
              // Create a TCP/IP socket.
              Socket client = new Socket(AddressFamily.InterNetwork,
                  SocketType.Stream, ProtocolType.Tcp);
  
              // Connect to the remote endpoint. IMPORTANT: AsyncCallback will be called on seperate thread
              client.BeginConnect(remoteEP,
                  new AsyncCallback(ConnectCallback), client);
              connectDone.WaitOne();
  
              // Send test data to the remote device.
              string sendingMessage = message + "&lt;EOF&gt;";
              Send(client, sendingMessage);
              sendDone.WaitOne();
  
              // Receive the response from the remote device.
              Receive(client);
              receiveDone.WaitOne();
  
              // Write the response to the console.
              //statusPanel.Text += "Response received: " + response + "\n\n";
  
              // Release the socket.
              client.Shutdown(SocketShutdown.Both);
              client.Close();
          }
          catch (Exception e)
          {
              statusPanel.Dispatcher.BeginInvoke(new Action(() =&gt;
                  statusPanel.Text += e.ToString() + "\n"
                 ));
          }
      }
  
      public static void ConnectCallback(IAsyncResult ar)
      {
          try
          {
              // Retrieve the socket from the state object.
              Socket client = (Socket)ar.AsyncState;
  
  
              // Complete the connection.
              client.EndConnect(ar);
  
              //string remote = client.RemoteEndPoint.ToString();
  
            //  statusPanel.Dispatcher.BeginInvoke(new Action(() =&gt;
              //    statusPanel.Text = "Message send to: " + remote + "\n"
               //  ));
  
              // Signal that the connection has been made.
              connectDone.Set();
          }
          catch (Exception e)
          {
              statusPanel.Dispatcher.BeginInvoke(new Action(() =&gt;
                  statusPanel.Text += e.ToString() + "\n"
                 ));
          }
      }
  
      private static void Receive(Socket client)
      {
          try
          {
              // Create the state object.
              StateObject state = new StateObject();
              state.workSocket = client;
  
              // FOLLOWING LINE IS WHERE THE PROGRAM CHRASHES
              client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
                  new AsyncCallback(ReceiveCallback), state);
          }
          catch (Exception e)
          {
              statusPanel.Dispatcher.BeginInvoke(new Action(() =&gt;
                  statusPanel.Text += e.ToString() + "\n"
                 ));
          }
      }
  
      private static void ReceiveCallback(IAsyncResult ar)
      {
          try
          {
              // Retrieve the state object and the client socket 
              // from the asynchronous state object.
              StateObject state = (StateObject)ar.AsyncState;
              Socket client = state.workSocket;
  
              // Read data from the remote device.
              int bytesRead = client.EndReceive(ar);
  
              if (bytesRead &gt; 0)
              {
                  // There might be more data, so store the data received so far.
                  state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead));
  
                  // Get the rest of the data.
                  client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
                      new AsyncCallback(ReceiveCallback), state);
              }
              else
              {
                  // All the data has arrived; put it in response.
                  if (state.sb.Length &gt; 1)
                  {
                      response = state.sb.ToString();
                  }
  
                  // Signal that all bytes have been received.
                  receiveDone.Set();
              }
          }
          catch (Exception e)
          {
              statusPanel.Dispatcher.BeginInvoke(new Action(() =&gt;
                  statusPanel.Text += e.ToString() + "\n"
                 ));
          }
      }
  
      private static void Send(Socket client, String data)
      {
          // Convert the string data to byte data using ASCII encoding.
          byte[] byteData = Encoding.ASCII.GetBytes(data);
  
          // Begin sending the data to the remote device.
          client.BeginSend(byteData, 0, byteData.Length, 0,
              new AsyncCallback(SendCallback), client);
      }
  
      private static void SendCallback(IAsyncResult ar)
      {
          try
          {
              // Retrieve the socket from the state object.
              Socket client = (Socket)ar.AsyncState;
  
              // Signal that all bytes have been sent.
              sendDone.Set();
          }
          catch (Exception e)
          {
              statusPanel.Dispatcher.BeginInvoke(new Action(() =&gt;
                  statusPanel.Text += e.ToString() + "\n"
                 ));
          }
      }
  }
  </code></pre>