Communication socket par langage C et Python

C

Ceci est un exemple de programme pour la communication socket en langage C. Ici, pour l'expérience, j'essaie de me connecter du client à l'adresse de bouclage 127.0.0.1 afin que cela puisse être fait sur un ordinateur. J'ai fait référence à un site Web, mais j'ai oublié où il se trouve, donc je ne peux pas le mentionner, Ceci est un mémorandum pour débutant.

Code source

sserver

sserver.c


#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
 
int main() {
    int sockfd;
    int client_sockfd;
    struct sockaddr_in addr;
 
    socklen_t len = sizeof( struct sockaddr_in );
    struct sockaddr_in from_addr;
 
    char buf[1024];
 
    //Réception de l'initialisation du tampon
    memset( buf, 0, sizeof( buf ) );
 
    //Génération de socket
    if( ( sockfd = socket( AF_INET, SOCK_STREAM, 0 ) ) < 0 ) {
        perror( "socket" );
    }
 
    //Paramètre IP / numéro de port en veille
    addr.sin_family = AF_INET;
    addr.sin_port = htons( 1234 );
    addr.sin_addr.s_addr = INADDR_ANY;
 
    //lier
    if( bind( sockfd, (struct sockaddr *)&addr, sizeof( addr ) ) < 0 ) {
        perror( "bind" );
    }
 
    printf("waiting for client's connection..\n");
    //En attente de réception
    if( listen( sockfd, SOMAXCONN ) < 0 ) {
        perror( "listen" );
    }
 
    //En attente d'une demande de connexion d'un client
    if( ( client_sockfd = accept( sockfd, (struct sockaddr *)&from_addr, &len ) ) < 0 ) {
        perror( "accept" );
    }
 
    //Recevoir
    int rsize;
    while( 1 ) {
        rsize = recv( client_sockfd, buf, sizeof( buf ), 0 );
 
        if ( rsize == 0 ) {
            break;
        } else if ( rsize == -1 ) {
            perror( "recv" );
        } else {
            printf( "receive:%s\n", buf );
            sleep( 1 );
 
            //réponse
            printf( "send:%s\n", buf );
            write( client_sockfd, buf, rsize );
        }
    }
 
    //Prise fermée
    close( client_sockfd );
    close( sockfd );
 
    return 0;
}

sclient

sclient.c


#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
 
int main() {
    int sockfd;
    struct sockaddr_in addr;
 
    //Génération de socket
    if( (sockfd = socket( AF_INET, SOCK_STREAM, 0) ) < 0 ) {
        perror( "socket" );
    }
 
    //Réglage de l'adresse de destination / du numéro de port
    addr.sin_family = AF_INET;
    addr.sin_port = htons( 1234 );
    addr.sin_addr.s_addr = inet_addr( "127.0.0.1" );
 
    //Connexion serveur
    connect( sockfd, (struct sockaddr *)&addr, sizeof( struct sockaddr_in ) );
 
    //Transmission de données
    char send_str[10];
    char receive_str[10];
    for ( int i = 0; i < 8; i++ ){
        sprintf( send_str, "%d", i );
        printf( "send:%d\n", i );
        if( send( sockfd, send_str, 10, 0 ) < 0 ) {
            perror( "send" );
        } else {
            recv( sockfd, receive_str, 10, 0 );
            printf( "receive:%s\n", receive_str );
        }
        sleep( 1 );
    }
 
    //Prise fermée
    close( sockfd );
 
    return 0;
}

compiler

Compilez avec cc sserver.c -o ss pour le serveur et cc sclient.c -o sc pour le client.

Expérience

Tout d'abord, lancez sserver. Puis lancez sclient depuis un autre terminal. Ensuite, 8 données seront envoyées de sclient, les données seront affichées et le processus se terminera.

Résultat du test côté serveur

$ ./ss
waiting for client's connection..
receive:0
send:0
receive:1
send:1
receive:2
send:2
receive:3
send:3
receive:4
send:4
receive:5
send:5
receive:6
send:6
receive:7
send:7

Résultats expérimentaux Côté client

$ ./sc
send:0
receive:0
send:1
receive:1
send:2
receive:2
send:3
receive:3
send:4
receive:4
send:5
receive:5
send:6
receive:6
send:7
receive:7

Python3

Je l'ai également écrit en Python. Cela fonctionne de la même manière que la version C. Par rapport à C, vous pouvez écrire beaucoup plus clairement. Référence Qiita: [Traitement de la communication par Python] Encodez en binaire avec .encode () et décodez en chaîne avec .decode (). Lors de l'encodage de utf-8, utilisez .encode ('utf-8').

sserver.py


#!/usr/bin/python3
import socket

host = "127.0.0.1"
port = 1234

serversock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
serversock.bind((host,port)) #Lier en spécifiant IP et PORT
serversock.listen(10) #Écouter une connexion (spécifier le nombre maximum de files d'attente)

print('Waiting for connections...')
clientsock, client_address = serversock.accept() #Stocker les données une fois connecté

for i in range ( 8 ):
    rcvmsg = clientsock.recv(1024).decode()
    print('Received : %s' % (rcvmsg))
    s_msg = str(i)
    print('Send : %s' % s_msg)
    clientsock.sendall(s_msg.encode())
clientsock.close()

sclient.py


#!/usr/bin/python3
import socket

host = "127.0.0.1"
port = 1234

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #Créer un objet

client.connect((host, port)) #Connectez-vous maintenant au serveur

for i in range(8):
  message = str(i)
  print('Send : %s' % message)
  client.send(message.encode()) #Envoyer des données
  response = client.recv(4096) #La réception doit être une puissance appropriée de 2 (pas trop grande)
  print('Received: %s' % response.decode())

Recommended Posts

Communication socket par langage C et Python
Communication socket et traitement multi-thread par Python
Communication de socket avec Python
Traitement de la communication par Python
Python lancé par des programmeurs C
Communication de socket avec Python LEGO Mindstorms
Pointeur de fonction et objdump ~ Langage C ~
Introduction à Protobuf-c (langage C ⇔ Python)
100 Language Processing Knock Chapitre 1 par Python
Appeler le langage C depuis Python (python.h)
4 langage de comparaison de fermeture (Python, JavaScript, Java, C ++)
Implémenter le filtre FIR en langage Python et C
Communication de socket en utilisant le serveur de socket avec python maintenant
Générer un langage C à partir d'une expression S avec Python
RaspberryPi L Chika avec Python et C #
Communication de données chiffrées entre Python et C #
J'ai essayé de communiquer avec un serveur distant par communication Socket avec Python.
Langage C pour voir et se souvenir de la partie 1 Appeler le langage C depuis Python (bonjour le monde)
Résolution avec Ruby et Python AtCoder ABC172 C Dichotomie de somme cumulée
Langage C pour voir et se souvenir de la partie 4 Appelez le langage C depuis Python (argument) double
Langage C pour voir et se souvenir de la partie 5 Appel du langage C à partir du tableau Python (argument)
Comment générer une séquence en Python et C ++
62 scripts de conversion décimale <-> par langage (R, Python, Java)
Outil de développement / analyse du langage C tiré d'exemples
Écriture de journaux dans un fichier CSV (Python, langage C)
notes de python C ++
python, openFrameworks (c ++)
J'ai fait un module en langage C qui filtre les images chargées par Python
Notifier l'erreur et la fin de l'exécution par LINE [Python]
Langage C pour voir et se souvenir de la partie 3 Appelez le langage C depuis Python (argument) c = a + b
Exemple de communication Python Socket / outil de lancement de données simple
Divisez les images Python et disposez-les côte à côte
Python> Trier par nombre et trier par alphabet> Utiliser trié ()
[Traitement du langage 100 coups 2020] Résumé des exemples de réponses par Python
Essayez de créer un module Python en langage C
Benchmarks langage C, Java, Python avec factorisation prime
Reçoit et génère la sortie standard des implémentations Python 2 et Python 3> C
Contrôler d'autres programmes depuis Python (communication entre Python ⇔ exe)
Mémo d'apprentissage Python pour l'apprentissage automatique par Chainer chapitres 1 et 2
Envoyer des données de Python au traitement via une communication socket
Le VIF calculé par Python et le VIF calculé par Excel sont différents .. ??
Communication inter-processus entre Ruby et Python (file d'attente de messages POSIX)
Mémo de "Cython-Accélérer Python en fusionnant avec C"
Serveur HTTP et client HTTP utilisant Socket (+ navigateur Web) --Python3
Aller à la langue pour voir et se souvenir du langage Partie 7 C en langage GO
Communication série avec Python
[python] Compresser et décompresser
Jugement des nombres premiers par Python
Communication série avec python
Python: traitement du langage naturel
Mémo de visualisation par Python
Pointeur de modèle d'extension Python C / C ++
Itérateur et générateur Python
Paquets et modules Python
Intégration Vue-Cli et Python
File d'attente ALDS1_3_B langage C
Ruby, Python et carte
Introduction au langage Python