2009-03-26 8 views
0

Veuillez noter que la question concerne l'utilisation d'un mode de rappel asynchrone uniquement sur les sockets! Je veux construire un client TCP qui m'avertira quand un paquet est reçu et quand je le socket est fermé, parce que les fonctionnalités que NET offre avec beginRecv, endRecv n'informe pas si la connexion est toujours disponible.Client TCP Callback asynchrone

Ma question: N'y a-t-il pas moyen de créer un client TCP de la même manière que WinAPI? Je veux dire appeler WSAAsyncSelect avec un message, quand le message est reçu, il appelle la fonction que vous avez appelée dans WSAAsyncSelect, puis vous pouvez voir si la connexion est fermée ou s'il y a un nouveau paquet dans WParams FD_CLOSE FD_READ FD_WRITE.

S'il n'y a pas.Ne puis-je pas contrôler ma connexion et mes paquets entrants en même temps? Je ne veux pas appeler BeginRecv EndRecv tout le temps. -.-

Merci d'avance!

+0

Faut-il être asynchrone, ou pouvez-vous faire une version à fil qui fait ce que vous voulez? – sfossen

+0

S'agit-il d'un client ou d'un serveur? Écoutez-vous ou vous connectez-vous? – sfossen

Répondre

1

Si vous passez un objet d'état qui comprend une référence à votre prise, vous aurez accès à la prise lui-même.

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

Votre question n'est pas vraiment claire. Par le ton de votre question, il semble que vous ne voulez pas faire de travail supplémentaire. Vous ne pouvez pas faire d'async sans travail supplémentaire.

La meilleure approche consiste à utiliser l'API asynchrone de Microsoft à l'aide de BeginReceive/EndReceive. Ceux-ci appellent vos callbacks lorsque le socket est fermé. Cependant, vous ne pouvez pas facilement utiliser le support IO Stream dans .NET en faisant cela, donc il y a du travail supplémentaire.

Si vous voulez plus de contrôle, vous devez faire plus de travail. C'est tout ce qu'on peut en dire.

+0

@Mystere Man, quand j'appelle BeginDisconnect, il me déconnecte, alors que je m'attends à ce que le programme répète quand le socket est déconnecté par le serveur. Je me sens bien avec BeginRecv, EndRecv, mais il ne m'avertit pas si la connexion est encore en vie.C'est pourquoi je suis tellement en colère. Pourriez-vous fournir une solution –

+0

Il n'est pas nécessaire de vous avertir si la connexion est active, il suffit de vous avertir lorsque la connexion est déconnectée. EndReceive le fait en retournant une exception, ou 0 octets. –