2010-09-02 26 views
4

J'essaie de faire une application pour iPhone qui peut écouter le trafic sur un port réseau spécifique.Comment écouter sur un port réseau dans Objective-C

Un serveur sur mon réseau envoie des messages (différents messages d'état pour les périphériques que le serveur gère) sur un port spécifique. Mon problème est que quand je fais un thread et makePairWithSocket je bloque le port pour d'autres qui veulent envoyer des messages au serveur, donc je veux seulement écouter le trafic sur un port spécifié, puis vérifier pour les heraders spécifiques et Ensuite, utilisez ces messages. Je sais comment faire la connexion et de parler au serveur en utilisant écriture et de lecture des flux, mais je makePairWithSocket et de bloquer le port pour tous les autres périphériques sur le réseau

Toute personne qui a des suggestions sur la façon d'écouter un Port en Objective-C sans appairage avec le serveur?

Merci à l'avance Daniel

Répondre

0

Je pense que cela nécessite un soutien réseau bien au-dessous du niveau de l'API socket, peut-être au niveau des pilotes de matériel, en supposant que les paquets sont même être acheminés vers votre appareil.

+0

Je pense qu'il veut capturer un paquet de diffusion UDP, ce qui peut être fait au niveau de l'API socket. – dreamlax

+0

Le serveur enverra une réponse à l'adresse IP qui a envoyé la question, donc je veux coupler et envoyer une question puis fermer la connexion et attendre une réponse adressée à moi. Mais si je reste couplé, le serveur n'enverra pas la réponse car je bloque le port et il pensera que je vais envoyer plus de données. Pouvez-vous accepter les "appels" sans avoir la connexion? – KungWaz

+0

Je peux coder en dur l'IP de l'iPhone dans le serveur afin qu'il envoie à cette adresse IP quand il y a un changement d'état. Mais comment accepter la connexion sans coupler et bloquer le port? – KungWaz

4

Découvrez CocoaAsyncSocket. Cela vous donne une manière agréable et structurée (avec des délégués) d'envoyer et de recevoir des données ... même avec plusieurs clients. La documentation est assez bonne. project link

edit: Jetez un oeil à la classe AsyncUdpSocket pour une connexion UDP sans état.

+0

J'ai jeté un coup d'oeil sur ce site de projet avant, mais je ne peux pas vraiment trouver quelque chose qui le fera sans se connecter au serveur et bloquer le port. Avez-vous des idées sur la façon de contourner cela avec AsyncSocket? – KungWaz

+0

a trouvé ceci: -acceptOnAddress: port: erreur: Que puis-je créer pour l'utiliser? Si j'ai un fil, comment ça marche? -acceptOnAddress: port: error: Je suppose que c'est ce que je cherche, pour accepter les connexions d'un hôte spécifique sur un port spécifique, mais comment l'implémenter pour que je puisse l'écouter en arrière-plan? – KungWaz

+1

Un serveur peut accepter plusieurs connexions sur un seul port. AsyncSocketDelegate du serveur a la méthode de réception "- (void) onSocket: (AsyncSocket *) sock Données didReadData: (NSData *) avec Tag: (long);" où le paramètre "sock" appartient au client qui envoie les données. Vous pouvez stocker le paramètre "sock" et utiliser [sock writeData:] pour envoyer des données à ce client spécifique. Donc le port n'est pas bloqué. Vous n'avez pas besoin de déconnecter une connexion. Jetez un oeil aux exemples fournis avec CococaAsyncSocket. – Felix