2010-11-16 27 views
0

J'essaye d'écrire le serveur de causerie d'udp dans le langage c. J'ai écrit le serveur de chat de TCP avant et c'est ok. Dans le serveur tcp, la fonction d'acceptation renvoie un numéro fd et le serveur communique avec un client spécifique en fonction de ce numéro fdserveur de discussion udp en c

mais dans udp, comment puis-je écouter un client spécifique?

Dans mon serveur TCP, après qu'un client se connecte au serveur, un thread est créé et il écoute ce client. Donc, pour chaque client, il y a un thread qui écoute selon le nombre fd qui est retourné par la fonction d'acceptation. donc n'importe quel message peut envoyer en fonction de ce numéro fd à un client spécifique.

Comment puis-je y parvenir sur le serveur udp?

Merci pour les réponses.

Répondre

1

Vous utilisez recvfrom pour trouver l'adresse IP/port source et répondez ensuite avec sendto. Vous avez seulement besoin de bind pour sélectionner un port de serveur. Vous n'avez pas accept. Tout pour connect pour UDP est défini la destination par défaut (que vous prévoyez de remplacer avec sendto).

+0

J'ai utilisé la fonction recvfrom et sendto. Premièrement, le client envoie un message au serveur par sendto. et le serveur prend le message par recvfrom. En recvfrom je prends l'adresse du client par sockaddr_in struct. Après je ne peux pas achive lier cela et utiliser sendto – cemal

+0

Vous ne * liez * pas à cela, c'est la destination. Vous laissez votre socket seul et appelez 'sendto'. –

0

Créez simplement un socket UDP et appelez connect(). Mais tu ne veux pas faire ça. Tout le plaisir des serveurs UDP est qu'ils n'ont besoin que d'une seule socket. Pensez-y. Vous n'avez besoin que du thread dans TCP car vous êtes obligé d'avoir un socket dédié, et un thread dédié est le moyen le plus simple (et pas le seul) de le gérer. En UDP, vous pouvez continuer à lire depuis le même socket, et l'adresse source vous indique de quel client provient chaque diagramme.

+1

voici mon exemple de code: – cemal

0

J'ai utilisé la fonction recvfrom et sendto. Premièrement, le client envoie un message au serveur par sendto. et le serveur prend le message par recvfrom. En recvfrom je prends l'adresse du client par sockaddr_in struct. Après je ne peux pas achive lier cela et utiliser sendto

1

C'est preety simple. Comme vous le savez UDP est sans connexion, il peut partager le même port.Ainsi, l'idée est ici.Je créer un fil pour chaque client.Il sera génial si vous avez plus de CPU core.you pouvez utiliser chaque noyau pour un certain nombre de clients (Cela peut être fait par carte) Maintenant, quand le même client frappe à nouveau, envoyez-le simplement à ce thread et au noyau. Donc, si vous avez 1 ... n core, vous devez créer n thread avec le réglage cpu à chaque thread.

J'ai fait une expérience avec le serveur 8 core de cette façon et ça a bien fonctionné.

Je donnerai ce code sur mon blog dans quelques jours plus tard, après cheacking à commutateur gigabit .. :)

matrixsust.blogspot.com

Hope it helps .