views:

3692

answers:

3

Hello,

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!

+1  A: 

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.

Mystere Man
@Mystere Man,when I call BeginDisconnect it disconnects me,while I'm expecting the program to do the callback when the socket gets disconnect by server.I feel fine with BeginRecv,EndRecv ,but It doesnt notify me if the connection is still alive.That's why im so angry.Could you provide a solution
John
It doesn't have to notify you if the connection is alive, it need only notify you when the connection is dead. EndReceive does this by returning an exception, or 0 bytes.
Mystere Man
A: 

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

sfossen
+1  A: 

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);
}
scottm