Quand Socket.Envoyer les données?
Question de débutant à nouveau: Sorte de suite à une question que j'avais posée il n'ya pas longtemps.
Je suis en train d'essayer de comprendre ce socket synchrone tutoriel http://msdn.microsoft.com/en-us/library/6y0e13d3.aspx, en particulier d'une seule ligne du code ci-dessous.
QUESTION:
Je veux m'assurer que je suis de comprendre le déroulement du programme, à droite . Quand n'gestionnaire.Recevoir(en octets) de retour? Est-il de retour et de stocker le nombre d'octets reçus dans int bytesRec**quand il "déborde" et a reçu plus de 1024bytes? **Et si c'est le cas, et cela peut paraître idiot, qu'advient-il si PLUS d'octets arriver comme c'est le stockage de l'1024 octets dans l' *données*variable et pas à l'écoute pour plus d'octets que peut-être d'arriver à ce moment-là? Ou devrais-je vous inquiétez pas à ce sujet et de les laisser .net prendre soin de cela?
Socket handler = listener.Accept();
data = null;
//An incoming connection needs to be processed.
while (true) {
bytes = new byte[1024];
int bytesRec = handler.Receive(bytes);
//My question is WHEN does the following line
//get to be executed
data += Encoding.ASCII.GetString(bytes,0,bytesRec);
if (data.IndexOf("<EOF>") > -1) {
break;
}
}
OriginalL'auteur iAteABug_And_iLiked_it | 2013-03-20
Vous devez vous connecter pour publier un commentaire.
Documentation:
Pas, il est toujours renvoie le nombre d'octets qui ont été lus. Si elle n'a pas, comment pouvez-vous savoir quelle est la partie de
bytes
contient des données significatives et la partie n'a pas été utilisé?Il est très important pour comprendre comment les sockets généralement de travail: octets peut-être arriver dans les paquets, mais aussi loin que le récepteur est concerné chaque octet doit être considéré indépendamment. Cela signifie qu'il n'y a aucune garantie que vous obtiendrez les octets dans les morceaux envoyé de l'expéditeur, et bien sûr, il n'y a aucune garantie qu'il y est suffisamment de données pour remplir votre tampon.
Si vous souhaitez uniquement pour traiter les données entrantes en 1024 octets morceaux, il est de votre responsabilité de garder l'appel
Receive
jusqu'à ce qu'il a publié 1024 octets au total.Rappelons que la
Receive
ne sera pas stocker 1024 octets dans le buffer parce que c'est le tampon de la taille. Il va stocker jusqu'à 1024 octets.Si il n'y a plus de données mises en mémoire tampon interne par le réseau de la pile de votre tampon peut contenir puis 1024 octets sera donné de nouveau à vous et le reste va rester dans le réseau de la pile en mémoire jusqu'à ce que vous appelez
Receive
de nouveau. SiReceive
a commencé la copie des données de votre tampon et à ce moment, plus de réception des données par le réseau alors très probablement ce qui va arriver, c'est que ceux-ci devront attendre le prochainReceive
appel.Après tout, à aucun moment, quelqu'un at-il une garantie que
Receive
serait de vous donner tous les données qu'il peut (même si bien sûr c'est souhaitable et c'est ce qui arrive la plupart du temps).Genre de. Mais cette description occulte le fait très important que la pile réseau peut décider de vous remettre des données quelle que soit la morceaux choisit. Il n'y a aucune garantie.
merci pour ce superbe réponse. Quand vous dites "la pile réseau peut décider de vous remettre des données selon les morceaux, il choisit de" ça veut dire que mon client peut envoyer "Désolé chérie, je ne suis pas seul, mais marié", mais mon serveur peut recevoir", mais marié" avant "désolé chérie"? Microsoft code ci-dessus ne fait pas une telle vérification d'erreur...pas de tcp/ip de prendre soin de ce que j'ai donc recevoir des données dans le bon ordre
Non, parce que de la garanties que TCP fournit (en supposant que vous êtes en utilisant les sockets TCP). Mais il pourrait vous donner toutes les données en une seule fois, ou une seule lettre avec chaque
Receive
appel, ou quelque chose entre les deux. la Plupart du temps le rendra en morceaux tout comme l'expéditeur l'a envoyé, mais vous ne pouvez pas compter sur cela. Voir aussi une autre réponse de la mine ici.thx... je l'ai trouvé à la fois vos réponses très utiles.
OriginalL'auteur Jon