Ivan Prodanov
Ivan Prodanov

Reputation: 35522

TCP client Asynchronous socket callback

Please note the question is about using an asynchronous callback mode only on sockets!

I want to build a TCP client that will notify me when a packet is received and when i the socket is being closed,because the feautures that NET offers with beginRecv,endRecv doesn't inform if the connection is still available.

My question: Isn't there a way to create a TCP client much like using WinAPI?

I mean calling WSAAsyncSelect with a message,when the message is received it calls the function you've called in WSAAsyncSelect and then you can see whether the connection is closed or there's a new packet through the WParams FD_CLOSE FD_READ FD_WRITE.

If there isn't.Can't I control my connection and my incoming packets at the same time? I don't want to call BeginRecv EndRecv all the time. -.-

Thanks in advance!

Upvotes: 0

Views: 15954

Answers (3)

scottm
scottm

Reputation: 28699

If you pass a state object which includes a reference to your socket, You'll have access to the socket itself.

public class SocketState
{
  public SocketState(Socket s)
  {
    this._socket = s;
  }

   private Socket _socket;
   public Socket Socket
   {
     get{return _socket;}
   }
}


void SomeFunction()
{
//do some stuff in your code

SocketState stateObject = new SocketState(mySocket);
mySocket.BeginReceive(buffer, offset, size, flags, CallBack, stateObject);
//do some other stuff
}

public void CallBack(IAsyncResult result)
{
  SocketState state = (SocketState)result.AsyncState;
  state.Socket.EndReceive(result);

  //do stuff with your socket.
  if(state.Socket.Available)
    mySocket.BeginReceive(buffer, offset, size, flags, CallBack, state);
}

Upvotes: 1

sfossen
sfossen

Reputation: 4778

You could also write a simple threaded version to monitor the socket and give you the events and call the callbacks.

Server type code

Simple Socket code

Upvotes: 0

Erik Funkenbusch
Erik Funkenbusch

Reputation: 93444

Your question is not really clear. By the tone of your question, it seems like you don't want to do any extra work. You can't do async without some extra work.

The best approach is to use the Asynchronous API from Microsoft, using BeginReceive/EndReceive. These will call your callbacks when the socket is closed. However, you cannot easily use the IO Stream support in .NET by doing this, so there is some extra work involved.

If you want more control, you have to do more work. That's all there is to it.

Upvotes: 1

Related Questions