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.
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;
}
Compilez avec cc sserver.c -o ss
pour le serveur et cc sclient.c -o sc
pour le client.
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