2009-07-27 7 views
1

J'ai un problème étrange avec mon code, pour le moment tout fonctionne bien, sauf la partie d'envoi. Chaque fois que j'essaie d'envoyer un paquet, il envoie en réalité beaucoup de paquets vides, et je ne peux pas savoir pourquoi, j'ai vérifié avec le débogueur et la fonction SendPacket n'est appelée qu'une seule fois. Merci à tout le monde!C# problème de socket asynchrone

+0

Comment lisez-vous du côté serveur? TCP est un protocole de flux, il ne "pense" pas dans les paquets. Le récepteur peut avoir besoin d'avoir plusieurs appels à recevoir pour obtenir toutes les données d'un seul envoi, de même, plusieurs envois peuvent se retrouver dans une seule réception en raison de Nagle. Vous envoyez un tableau vide (c'est-à-dire tous les zéros). Si votre serveur interprète cela bizarrement, ou appelle Recevoir avec un petit tampon, il semblera "plusieurs paquets". –

+0

Wow. Après toutes ces heures .. le problème était dans la ligne suivante Client.BeginSend (buff, 0, buff.length, SocketFlags.None, nouveau AsyncCallback (SendData), client); Il envoyait 8192 octets à l'application côté serveur .. hé, je suis un idiot, merci pour votre quand même! –

+0

Je peux vous voir probablement raté, mais mon commentaire plus tôt est la ** seconde ** fois que je vous ai dit que vous envoyez le tableau plein de zéros. "En tous cas." –

Répondre

0

Ce que je vois: vous passez un tableau (loginOutBuffer) à Socket.BeginSend() dans SendPacket via OnPacketRecv, mais vous ne videz pas immédiatement après dans OnPacketRecv.

Socket.BeginSend() ne fait pas de copie du tableau lorsque vous le transmettez, il envoie donc les données dans le tableau maintenant effacé, ce qui entraîne la sortie de zéros à l'autre extrémité. Qu'entendez-vous par «un paquet vide»?

+0

C'est vrai, mais ce n'est pas lié au problème principal lui-même. Le problème est que je reçois beaucoup de paquets vides dans mon application serveur, même si j'appelle beginend une seule fois. Encore merci pour votre aide! –

+0

Voir mon commentaire sur votre question pour ma réponse. –