2012-11-03 1 views
1

J'ai écrit un seul programme client-serveur et je voudrais demander: Y at-il une différence de comportement entre les systèmes d'exploitation 32 et 64 bits de la fonction recv()? .Recv() Différences de comportement entre les systèmes d'exploitation 32 et 64 bits

Je pose cette question parce que je cours à la fois le serveur et le client sur un ordinateur portable 64 bits et tout fonctionne bien. J'appelle recv() de cette façon: while((tmp = recv(client_sock,rec_msg,256,0))>0) et comme prévu si par exemple j'ai 3 chaînes à envoyer du client, dans la partie serveur il entre dans le temps 3 et imprime le bon résultat. Lorsque j'exécute exactement les mêmes programmes sur une machine Debian 32 bits, il semble que pour une raison inconnue, si j'envoie 3 chaînes par exemple du client, elle n'entre qu'une seule fois dans la boucle while de la partie serveur et reçoit les 3 chaînes comme un. J'ai utilisé des instructions d'impression et découvert qu'il entre dans la boucle while une fois et reçoit tout le tampon bien que dans la partie client alors que la boucle est entrée 3 fois comme prévu et 3 chaînes sont envoyées dans 3 fois différentes. Je ne peux pas trouver une raison logique pour laquelle cela fonctionne bien sur 64 bits et ne fonctionne pas en 32 bits et c'est pourquoi je pose cette question.

Merci d'avance pour votre temps et votre aide.

+0

Utilisez-vous le même système d'exploitation pour les versions 32 bits et 64 bits? Il ne peut pas nécessairement être une différence dans l'architecture du processeur, mais peut-être une gestion de l'OS/pilote de l'appel système? –

+0

Merci pour la réponse.Non, j'utilise différents OS ... Mint dans le premier cas et Debian dans le second.Mais je ne pense pas que cela provoque la différence.Les raisons de cette différence (limites non maintenues), sont probablement ceux expliqués dans la réponse ci-dessous. – SpyrosR

Répondre

4

S'il s'agit d'un socket de flux, il n'y a pas de limites inhérentes au message et il n'y a pas de corrélation entre les messages envoyés et reçus. recv() peut renvoyer une partie d'un message, le message entier ou plusieurs messages; Tout ce qui est garanti, c'est que les octets sont reçus dans le même ordre que celui où ils ont été envoyés.

La différence que vous voyez est probablement juste due aux différences de vitesse entre les deux machines. La machine 32 bits est plus lente, donc pendant le temps qu'il faut pour vérifier que les données sont disponibles sur le réseau, tous les 3 paquets sont arrivés. Mais la machine 64 bits plus rapide traite les données reçues du premier paquet avant que le second n'arrive.

+0

Oui c'est une socket de flux et j'ai oublié de dire que dans le premier cas je cours les programmes dans le même ordinateur portable et dans le second cas j'utilise deux machines différentes qui se connectent bien.Est-ce que la raison de cette différence? reçu exactement dans le même ordre qu'ils ont été envoyés. Merci beaucoup pour votre réponse. – SpyrosR

+2

Oui, l'envoi entre machines et sur la même machine peut également faire la différence. Les différences ne sont pas intentionnelles, elles ne sont que des effets secondaires de la façon dont les données sont traitées. Lorsque vous utilisez des sockets de flux, vous ne devez JAMAIS vous attendre à ce que les limites des messages soient maintenues. – Barmar

+0

Ok, j'ai compris pourquoi cela se produit. Merci encore! – SpyrosR

Questions connexes