2010-07-28 2 views
0

Je joue avec les appels 'recvfrom' et 'sendto' en utilisant UDP. J'ai un client qui ne fait que diffuser des paquets UDP sur le port 6000. J'ai un serveur qui lie un socket sur le port 6000, et effectue un seul recvfrom.L'appel UDP recvfrom renvoie un mauvais numéro de port. Pourquoi?

Le problème est que le membre sin_port de struct sockaddr retourné par recvfrom est toujours incorrect. Pourquoi?

Je posterais du code source mais quelqu'un a déjà posté cette question (sans réponse) et j'utilise presque le même code que lui. En outre, vous pouvez obtenir plus d'informations sur ce problème en lisant son poste: FORUM POST.

Merci à l'avance

EDIT: Je pense vraiment 'cause numéro 2' de la réponse 'nos de pourrait être le problème. Comment puis-je le vérifier?

+2

Publiez votre code et dites quel système d'exploitation vous utilisez. – Roddy

Répondre

0

Convertissez-vous de l'ordre des octets du réseau?

+0

Oui, je vérifie réellement sur un débogueur et le champ sin_port n'a rien à voir avec 6000, peu importe si c'était little-endian ou big-endian enconded –

6

est ici 2 causes probables:

  1. Vous n'êtes pas convertir le sin_port d'accueillir ordre avant d'inspecter/afficher. sin_port vient en réseau endian. C'est-à-dire que vous pourriez montrer le port en tant que gros boutiste sur une petite machine d'extrémité.

  2. Votre client utilise un port source aléatoire. Donc, alors que votre port de destination est 6000, le port source du client est choisi au hasard. recvfrom vous donne l'adresse IP source et le numéro de port source. Pas le port de destination.

Si ce n'est ni l'un ni l'autre, veuillez fournir un code de test pertinent et les valeurs réelles que vous voyez. Il vous est possible par exemple avoir des débordements de tampon, ou quelque chose d'autre qui se passe. EDIT, en regardant le code dans votre lien, vous hardcode la taille de la mémoire tampon (udpPkg.udpRecvBuf) comme 1024. Le tampon est-il vraiment au moins 1024 gros? Sinon, vous débordez probablement udpPkg.udpRecvBuf.

+0

1) Je vérifie mes résultats sur un débogueur et le port reçu n'a rien à voir avec 6000. Le premier mot de l'adresse recvfrom est: '4D120002' et je m'attendais à '70170002', puisque 6000 = 0x1770 (0002 signifie INADDR, je suppose) En outre, ce numéro j'ai posté '4D12' change chaque fois que je lance le client. 2) Oui, je pense que le problème pourrait être sur le client. Y at-il de toute façon je peux le vérifier? Y at-il de toute façon je peux le 'réparer'. Merci d'avance. –

+0

Quelle est la taille de udpPkg.udpRecvBuf? Pourquoi attendez-vous 6000? - l'adresse de recvfrom vous donne l'adresse * source *, pas l'adresse de destination – nos

+0

Im utilisant des tampons de 256 octets et je n'envoie que des paquets de 4 octets. J'utilisais un client C et j'ai essayé de le faire avec C# et j'ai le même problème. L'exécution de CLR détecterait un débordement de tampon, j'espère. –

Questions connexes