En C sous Linux, comment utiliserais-je 2 programmes, ce dernier envoyant des données texte au premier affiché en utilisant stdout?

StackOverflow https://stackoverflow.com/questions/8867421

Question

J'écris un simple programme de messagerie instantanée en C sous Linux .

Pour le moment, j'ai un programme qui lie une socket à un port sur la machine locale, et écoute le texte des données envoyées par un autre programme connecté à mon local IP et port de la machine.

Eh bien, je peux demander à ce client d'envoyer des données texte à mon programme et de les afficher en utilisant stdout sur ma machine locale; cependant, je ne peux pas programmer un moyen de renvoyer des données à l'ordinateur client , car mon programme est occupé à écouter et à afficher le texte envoyé par l'ordinateur client.

Comment pourrais-je créer un nouveau processus (qui écoute et affiche le texte qui lui est envoyé par la machine cliente, puis prend ce texte et l'envoie au stdout de l'autre programme, tandis que l'autre programme s'occupe de stdin étant envoyé à la machine cliente) ou créer 2 programmes qui effectuent les tâches séparées (envoi, réception et affichage), et s'envoient les données appropriées?

Désolé si cela est étrange, et je clarifierai si nécessaire. J'ai regardé dans exec, execve, fork, etc. mais je ne sais pas si c'est le chemin approprié à rechercher, ou s'il y a un moyen plus simple qui me manque.

Toute aide serait grandement appréciée, merci.

: Rétrospectivement, j'ai pensé que ce serait beaucoup plus facile à réaliser avec 2 programmes séparés. L'un, le serveur de messagerie instantanée, et les autres, les clients de messagerie instantanée.

Les clients de messagerie instantanée se connectaient au programme de serveur de messagerie instantanée et enverraient le texte de leur choix au serveur de messagerie instantanée. Ensuite, le serveur de messagerie instantanée enregistre simplement les données qui lui sont envoyées dans un tampon / fichier avec les noms / adresses IP des clients ajoutés au texte qui lui est envoyé par chaque client, et envoie ce texte (au format nom: texte) à chaque client connecté.

Cela éliminerait le besoin d'une communication complexe inter-processus / programme pour stdin et stdout, et à la place, utiliserait un moyen simple de communication client / serveur , les programmes clients affichant le texte qui leur est envoyé depuis le serveur via stdout, et en utilisant stdin pour envoyer n'importe quel texte au serveur.

Cela dit, je suis toujours intéressé par quelqu'un qui réponde à ma question initiale: pour la science. Merci à tous d'avoir lu, et j'espère que quelqu'un bénéficiera de mon brainstorming mental, ou de toute autre réponse venant de la communauté.

Était-ce utile?

La solution

cependant, je ne peux pas programmer un moyen de renvoyer des données à la machine client, car mon programme est occupé à écouter et à afficher le texte envoyé par la machine client.

La même socket qui a été renvoyée par une prise d'écoute par accept() peut être utilisée à la fois pour l'envoi et la réception de données.Donc, votre socket n'est jamais "occupé" simplement parce que vous lisez à partir de celui-ci ... vous pouvez réécrire sur le même socket.

Si vous avez besoin de lire et d'écrire simultanément, partagez le socket renvoyé par accept() sur deux threads différents.Puisque deux tampons différents sont utilisés par la pile réseau pour envoyer et recevoir sur le socket, un thread dédié pour la lecture et un autre thread dédié pour l'écriture sur le socket seront thread-safe sans l'utilisation de mutex.

Autres conseils

J'irais avec fork () - créer un processus enfant et maintenant vous avez deux processus différents qui peuvent faire deux choses différentes sur deux sockets différents - l'un peut recevoir et l'autre envoyer.Je n'ai pas encore d'expérience personnelle avec le codage d'un client / serveur comme celui-ci, mais ce serait ma première tentative pour résoudre votre problème ...

Comme @bdonlan l'a mentionné dans un commentaire, vous avez certainement besoin d'un appel de multiplexage comme select ou de préférence poll (ou des appels système associés comme pselect, ppoll ...). Ces appels de multiplexage sont la primitive d'attendre sur plusieurs canaux à la fois (avec pselect et ppoll capables d'attendre atomiquement à la fois les événements et les signaux d'E / S). Lisez également la page de manuel select tutorial . Bien sûr, vous pouvez attendre plusieurs descripteurs de fichiers, et vous pouvez attendre les capacités de lecture et d'écriture (même sur le même socket, si nécessaire), dans le même syscall select ou poll.

Toutes les boucles et tous les frameworks basés sur des événements utilisent ces appels de multiplexage (comme poll ou select). Vous pouvez également utiliser libevent , ou même (en particulier lors du codage d'une application d'interface utilisateur graphique) un toolkit GUI comme Gtk ou Qt, qui sont tous basés sur une boucle d'événements centrale.

Je ne pense pas qu'avoir une application multi-processus ou multi-thread soit utile dans votre cas. Vous avez juste besoin d'une boucle d'événements.

Vous pouvez également demander à obtenir un signal SIGIO lorsque les données arrivent sur votre socket en utilisant fcntl avec F_SETOWN, mais ce n'est pas très utile pour vous. Ensuite, vous voulez souvent que votre socket ne bloque pas.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top