URL: https://linuxfr.org/forums/programmation-c--2/posts/programmer-un-client-r%C3%A9seau-en-c Title: Programmer un client réseau en C Authors: Gyro Gearllose Date: 2006年01月02日T15:40:44+01:00 Tags: Score: 0 Hello ! Voici ce qui m'amène : nous avons une vieille imprimante bull pr800 dont ne voulons pas nous séparer. Comme les serveurs sont maintenant centralisés, et que celle-ci le peut se connecter que par le biais d'un câble parallèle, j'envisage d'écrire un petit programme en C pour la piloter. En effet, ce modèle d'imprimante matricielle n'est que partiellement supporté par cups, il me faut donc pouvoir imprimer n'importe quoi dessus, pourvu que ce soit du texte. Comme ce n'est pas une imprimante ni pcl, ni postscript, pas moyen d'écrire un fichier ppd ou même un filtre pour cups, d'où mon idée initiale : - brancher cette vieille machine au réseau grâce à un boîtier hp jetdirect (cette partie fonctionne à merveille) - déclarer cette imprimante comme une file raw sur une socket (actuellement 192.168.0.190:9100) dans cups (ça fonctionne aussi). - écrire un petit programme en C qui : 1) ouvre une connexion vers cette imrpimante 2) lui envoie les codes escp/2 nécessaires à la configuration demandée 3) Fait un appel système à lp -d pr800 fichier pour envoyer le fichier via cups sur l'imprimante 4) Envoie un caractère de fin de page ^L à l'imprimante pour lui faire comprendre que c'est fini, et se recaler pour la suivante. Les points 2 et 3 sont acquis, car j'avais déjà fait ça en local en utilisant /dev/lp0. Pour le point 1, j'ai écrit ce bout de code, qui devrait imprimer un joli A sur ma feuille de papier, mais il ne fonctionne pas et me renvoie systématiquement : "Erreur: Connection refused". Le code :
#include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> int main () { int sockfd; int longueur; struct sockaddr_in adresse; int resultat; char ch='A'; sockfd = socket (AF_INET, SOCK_STREAM, 0); adresse.sin_family = AF_INET; adresse.sin_addr.s_addr = inet_addr("192.168.0.190"); adresse.sin_port = 9100; longueur = sizeof (adresse); resultat = connect (sockfd, (struct sockaddr *)&adresse, longueur); if (resultat == -1) { perror ("Erreur"); exit (1); } write (sockfd, &ch, 1); close (sockfd); exit(0); }Ce que je ne comprend pas, c'est que si je fais un telnet 192.168.0.190 9100, j'obtiens ce message ; Trying 192.168.127.190... Connected to 192.168.127.190. Escape character is '^]'. A partir de là, tout caractère tapé au clavier est immédiatement imprimé sur la feuille.... Je ne vois vraiment pas ce qui cloche, ni comment m'en sortir. Pour le point 4, le soucis, c'est qu'il faut ouvrir la socket quand cups (du moins la commande lp) l'a libéré, et pas avant pour lui envoyer le caractère ^L. Et ça, je ne sais pas comment coder ça. Merci pour votre aide et vos suggestions.