Socket-Kommunikation in C-Sprache und Python

C

Dies ist ein Beispielprogramm für die Socket-Kommunikation in C-Sprache. Hier versuche ich für das Experiment, eine Verbindung vom Client zur Loopback-Adresse 127.0.0.1 herzustellen, damit dies auf einem Computer durchgeführt werden kann. Ich habe auf eine Website verwiesen, aber ich habe vergessen, wo sie sich befindet, daher kann ich sie nicht erwähnen. Dies ist ein Memorandum für Anfänger.

Quellcode

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];
 
    //Pufferinitialisierung empfangen
    memset( buf, 0, sizeof( buf ) );
 
    //Steckdosengenerierung
    if( ( sockfd = socket( AF_INET, SOCK_STREAM, 0 ) ) < 0 ) {
        perror( "socket" );
    }
 
    //Einstellung der Standby-IP- / Portnummer
    addr.sin_family = AF_INET;
    addr.sin_port = htons( 1234 );
    addr.sin_addr.s_addr = INADDR_ANY;
 
    //binden
    if( bind( sockfd, (struct sockaddr *)&addr, sizeof( addr ) ) < 0 ) {
        perror( "bind" );
    }
 
    printf("waiting for client's connection..\n");
    //Warten auf Empfang
    if( listen( sockfd, SOMAXCONN ) < 0 ) {
        perror( "listen" );
    }
 
    //Warten auf eine Verbindungsanforderung von einem Client
    if( ( client_sockfd = accept( sockfd, (struct sockaddr *)&from_addr, &len ) ) < 0 ) {
        perror( "accept" );
    }
 
    //Erhalten
    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 );
 
            //Antwort
            printf( "send:%s\n", buf );
            write( client_sockfd, buf, rsize );
        }
    }
 
    //Steckdose geschlossen
    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;
 
    //Steckdosengenerierung
    if( (sockfd = socket( AF_INET, SOCK_STREAM, 0) ) < 0 ) {
        perror( "socket" );
    }
 
    //Einstellung der Zieladresse / Portnummer
    addr.sin_family = AF_INET;
    addr.sin_port = htons( 1234 );
    addr.sin_addr.s_addr = inet_addr( "127.0.0.1" );
 
    //Serververbindung
    connect( sockfd, (struct sockaddr *)&addr, sizeof( struct sockaddr_in ) );
 
    //Datenübertragung
    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 );
    }
 
    //Steckdose geschlossen
    close( sockfd );
 
    return 0;
}

kompilieren

Kompilieren Sie mit "cc sserver.c -o ss" für den Server und "cc sclient.c -o sc" für den Client.

Experiment

Starten Sie zunächst sserver. Starten Sie dann sclient von einem anderen Terminal aus. Dann werden 8 Daten von sclient gesendet, die Daten werden angezeigt und der Vorgang wird beendet.

Experiment Ergebnis Server Seite

$ ./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

Experimentelle Ergebnisse Client-Seite

$ ./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

Ich habe es auch in Python geschrieben. Dies funktioniert genauso wie die C-Version. Im Vergleich zu C können Sie viel klarer schreiben. Referenz Qiita: [Kommunikationsverarbeitung durch Python] Mit .encode () in Binärcode codieren und mit .decode () in einen String dekodieren. Verwenden Sie beim Codieren von utf-8 .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)) #Binden Sie durch Angabe von IP und PORT
serversock.listen(10) #Warten Sie auf eine Verbindung (geben Sie die maximale Anzahl von Warteschlangen an).

print('Waiting for connections...')
clientsock, client_address = serversock.accept() #Speichern Sie Daten, wenn eine Verbindung besteht

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) #Erstellen Sie ein Objekt

client.connect((host, port)) #Stellen Sie nun eine Verbindung zum Server her

for i in range(8):
  message = str(i)
  print('Send : %s' % message)
  client.send(message.encode()) #Daten senden
  response = client.recv(4096) #Empfangen sollte eine angemessene Potenz von 2 sein (nicht zu groß)
  print('Received: %s' % response.decode())

Recommended Posts

Socket-Kommunikation in C-Sprache und Python
Socket-Kommunikation und Multithread-Verarbeitung durch Python
Socket-Kommunikation mit Python
Kommunikationsverarbeitung durch Python
Python wurde von C-Programmierern gestartet
Socket-Kommunikation mit Python LEGO Mindstorms
Funktionszeiger und objdump ~ C language ~
Einführung in Protobuf-c (C-Sprache ⇔ Python)
100 Sprachverarbeitung Knock Kapitel 1 von Python
Rufen Sie die c-Sprache von Python aus auf (python.h)
4-Sprachen-Vergleich des Abschlusses (Python, JavaScript, Java, C ++)
Implementieren Sie den FIR-Filter in Python und C.
Socket-Kommunikation über Socket-Server mit Python jetzt
Generieren Sie mit Python eine C-Sprache aus dem S-Ausdruck
RaspberryPi L Chika mit Python und C #
Kommunikation verschlüsselter Daten zwischen Python und C #
Ich habe versucht, mit einem Remote-Server über Socket-Kommunikation mit Python zu kommunizieren.
C-Sprache zum Sehen und Erinnern Teil 1 Rufen Sie die C-Sprache aus Python auf (Hallo Welt)
Lösen mit Ruby und Python AtCoder ABC172 C Kumulative Summen-Dichotomie
C-Sprache zum Anzeigen und Erinnern Teil 4 Rufen Sie die C-Sprache von Python (Argument) double auf
C-Sprache zum Anzeigen und Erinnern Teil 5 Rufen Sie die C-Sprache aus dem Python-Array (Argument) auf
So generieren Sie eine Sequenz in Python und C ++
62-ary <-> dezimale Konvertierungsskripte nach Sprache (R, Python, Java)
C Sprachentwicklungs- / Analysetool aus Beispielen gelernt
Schreiben von Protokollen in eine CSV-Datei (Python, C-Sprache)
Python C ++ Notizen
Python, openFrameworks (c ++)
Ich habe ein Modul in C-Sprache erstellt, das von Python geladene Bilder filtert
Fehler und Abschluss der Ausführung durch LINE [Python] benachrichtigen
C-Sprache zum Sehen und Erinnern Teil 3 Rufen Sie die C-Sprache aus Python auf (Argument) c = a + b
Python Socket-Kommunikationsbeispiel / einfaches Tool zum Werfen von Daten
Teilen Sie Python-Bilder und ordnen Sie sie nebeneinander an
Python> Nach Nummer sortieren und nach Alphabet sortieren> Sortiert verwenden ()
[Sprachverarbeitung 100 Schläge 2020] Zusammenfassung der Antwortbeispiele von Python
Versuchen Sie, ein Python-Modul in C-Sprache zu erstellen
C-Sprache, Java, Python-Benchmarks mit Primfaktorisierung
Empfängt und gibt die Standardausgabe von Python 2- und Python 3> C-Implementierungen aus
Steuern Sie andere Programme von Python aus (Kommunikation zwischen Python ⇔ exe)
Python-Lernnotiz für maschinelles Lernen von Chainer Kapitel 1 und 2
Senden Sie Daten von Python über die Socket-Kommunikation an Processing
Das von Python berechnete VIF und das von Excel berechnete VIF sind unterschiedlich.
Prozessübergreifende Kommunikation zwischen Ruby und Python (POSIX-Nachrichtenwarteschlange)
Memo von "Cython beschleunigt Python durch Fusion mit C"
HTTP-Server und HTTP-Client mit Socket (+ Webbrowser) - Python3
Gehen Sie in die Sprache, um Teil 7 C in der Sprache GO zu sehen und sich daran zu erinnern
Serielle Kommunikation mit Python
[Python] Komprimieren und dekomprimieren
Primzahlbeurteilung durch Python
Serielle Kommunikation mit Python
Python: Verarbeitung natürlicher Sprache
Visualisierungsnotiz von Python
Python C / C ++ - Erweiterungsmusterzeiger
Python Iterator und Generator
Python-Pakete und -Module
Vue-Cli- und Python-Integration
C-Sprache ALDS1_3_B Warteschlange
Ruby, Python und Map
Einführung in die Python-Sprache