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.
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 Sie mit "cc sserver.c -o ss" für den Server und "cc sclient.c -o sc" für den Client.
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