Je reçois un rappel de réception d'une méthode client asynchrone qui est censée appeler socket.BeginReceive
en interne pour vérifier si les données sont en cours d'envoi. Le code est le suivant:Async Socket.BeginReceive Mystère d'appel interne
private 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));
client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
new AsyncCallback(ReceiveCallback), state);
}
else
{
if (state.sb.Length > 1)
{
response = state.sb.ToString();
}
File.AppendAllText(DataDisplay.Properties.Settings.Default.rawDataLog, response + "\r\n");
receiveDone.Set();
}
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
Le problème est que lorsque le code atteint l'appel client.BeginReceive
, rien ne se passe. Je sais que cela semble vague, alors laissez-moi essayer d'expliquer. J'ai défini des points d'inflexion dans le code pour voir où cela pourrait aller, et je ne peux pas le comprendre. J'ai essayé le cas else
, le début du ReceiveCallback
, où le receivedone.Set()
revient à dans le code principal, la déclaration catch
, etc. en vain.
La partie qui prête le plus à confusion est que lorsque je l'exécute avec un serveur de test que j'ai écrit, cela fonctionne comme je l'attendais. Ce code provient essentiellement de l'exemple MSDN sur les sockets asynchrones, au cas où il semble familier. Ce n'est que lorsque je l'essaie avec le périphérique tiers, je suis coincé.
Des idées sur ce qui pourrait se passer ici?
Lorsque je sonde l'objet StateObject, il a reçu une chaîne de données et l'a stockée, et le code arrive au point où il tente d'appeler client.BeginReceive à nouveau. Ne devrait pas au moins ré-entrer dans le ReceiveCallback, même s'il n'y a plus rien d'autre, ou suis-je confus? – CaffeineZombie
Si aucun délai d'attente n'est spécifié, le système attendra. Vous n'êtes pas sûr de l'implémentation sous-jacente. –
Je vous conseille de consulter la documentation sur la façon d'utiliser la méthode: http://msdn.microsoft.com/en-us/library/dxkwh6zw.aspx –