Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
116 changes: 116 additions & 0 deletions RETI/andruetto_lorenzo/socket_API/andruetto_echo_client_tcp.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>

/*
man 7 ip
man 7 tcp
*/

/* man perror */

#define BUFSIZE 1024

void error(char *msg)
{
perror(msg);
exit(1);
}

int socket_create()
{
int socket_fd;

if((socket_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0){
error("Cannot create the socket");
exit(1);
}

return socket_fd;
}

void socket_connect(int socket_fd, char *ip, unsigned short tcp_port)
{
struct in_addr server_ip; /* indirizzo ip */
struct sockaddr_in serveraddr; /* indirizzo e porta server */

/* converte l'indirizzo IP in dotted-notation in binario in network order */
inet_aton(ip, &server_ip);

/* inizializza la struttura che contiene le informazioni del socket */
memset(&serveraddr, '0', sizeof(serveraddr));
serveraddr.sin_family = AF_INET; /* socket IP */
serveraddr.sin_addr = server_ip;
serveraddr.sin_port = htons(tcp_port); /* porta tcp in network order*/

if(connect(socket_fd,
(struct sockaddr *)&serveraddr,
sizeof(struct sockaddr)) == -1) {
perror("Errone nella connessione al server");
exit(1);
}
}

int socket_receive(int socket_fd, char *buf)
{
int msg_size;

bzero(buf, BUFSIZE);
if((msg_size = read(socket_fd, buf, BUFSIZE)) < 0)
error("Errore nella ricezione dati");

return msg_size;
}

int socket_send(int socket_fd, char *buf)
{
int byte_sent;

if((byte_sent = write(socket_fd, buf, strlen(buf))) < 0)
error("Errore nell'invio dati");

return byte_sent;
}

int main(int argc, char **argv)
{
unsigned short tcp_port; /* porta tcp di destinazione */
char *ip; /* indirizzo ip di destinazione */
int socket_fd; /* connection socket */
char buf[BUFSIZE];
int byte_sent; /* numero byte inviati */
int msg_size;


/* Verifico la presenza dei parametre IP e porta */
if(argc != 4) {
printf("uso: %s <IP> <porta> <string>\n", argv[0]);
exit(1);
}

/* Acquisisco IP e numero di porta */
ip = argv[1];
tcp_port = (unsigned short)atoi(argv[2]);

/* Creo il socket */
socket_fd = socket_create();

// Inizia la connessione al socket remoto
socket_connect(socket_fd, ip, tcp_port);
printf("Socket connesso con il server %s sulla porta %d\n", ip, tcp_port);

/* invio sul socket la stringa */
byte_sent = socket_send(socket_fd, argv[3]);

msg_size = socket_receive(socket_fd, buf);

printf("Inviato %d bytes con successo\n", byte_sent);
printf("Ha ricevuto %d byte e una stringa %s con successo\n", msg_size, buf);


close(socket_fd);
}
129 changes: 129 additions & 0 deletions RETI/andruetto_lorenzo/socket_API/andruetto_echo_server_tcp.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>

/*
man 7 ip
man 7 tcp
*/

#define BUFSIZE 1024
#define MAX_CONN 10

/* man perror */
void error(char *msg)
{
perror(msg);
exit(1);
}

int socket_create()
{
int socket_fd;

if((socket_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0){
error("Errore nella creazione del socket");
exit(1);
}
return socket_fd;
}

void socket_bind(int socket_fd, unsigned short tcp_port)
{
struct sockaddr_in serveraddr; /* server address */

/* inizializza la struttura che contiene le informazioni del socket */
memset(&serveraddr, '0', sizeof(serveraddr));
serveraddr.sin_family = AF_INET; /* socket IP */
serveraddr.sin_addr.s_addr = htonl(INADDR_ANY); /* 0.0.0.0 */
serveraddr.sin_port = htons(tcp_port); /* porta tcp in network order*/

/* bind del socket con indirizzo e porta */
if(bind(socket_fd, (struct sockaddr *) &serveraddr, sizeof(serveraddr)) < 0)
error("Errore nella fase di binding");
}

void socket_listen(int socket_fd)
{
if(listen(socket_fd, MAX_CONN) < 0) /* in ascolto sul socket max 10 connessioni*/
error("Errore nella fase di listen");
}

int socket_accept(int socket_fd)
{
int connection_fd;
struct sockaddr_in clientaddr; /* client address */
socklen_t clientlen = sizeof(clientaddr);

/* accetta una connessione TCP da un client */
if((connection_fd = accept(socket_fd,
(struct sockaddr *) &clientaddr,
&clientlen)) < 0)
error("Errore nella fase di accept");
return connection_fd;
}

int socket_receive(int socket_fd, char *buf)
{
int msg_size;

bzero(buf, BUFSIZE);
if((msg_size = read(socket_fd, buf, BUFSIZE)) < 0)
error("Errore nella ricezione dati");

return msg_size;
}


int socket_send(int socket_fd, char *buf)
{
int byte_sent;

if((byte_sent = write(socket_fd, buf, strlen(buf))) < 0)
error("Errore nell'invio dati");

return byte_sent;
}
int main(int argc, char **argv)
{
unsigned short tcp_port; /* TCP port in ascolto */
int socket_fd; /* welcoming socket file descriptor */
int connection_fd; /* connection socket file descriptor */
char buf[BUFSIZE]; /* RX buffer */
int msg_size; /* dimensione messaggio ricevuto */

/* Verifico la presenza del parametro porta e lo leggo*/
if(argc != 2) {
printf("uso: %s <porta>\n", argv[0]);
exit(1);
}
tcp_port = (unsigned short)atoi(argv[1]);

/* Creo il socket */
socket_fd = socket_create();

/* bind del socket a IP e porta */
socket_bind(socket_fd, tcp_port);

/* metto il socket in ascolto */
socket_listen(socket_fd);

/* ciclo principale del server */
printf("Server TCP pronto e in ascolto sulla porta %d\n\n", tcp_port);
for(;;) {
/* rimango in attesa fino a quando arriva una richiesta da un client */
connection_fd = socket_accept(socket_fd);

msg_size = socket_receive(connection_fd, buf);
printf("TCP server ha ricevuto %d byte: %s\n", msg_size, buf);
int byte_sent = socket_send(connection_fd, buf);
printf("Inviato %d bytes con successo, e la stringa ricevuta: %s\n", byte_sent, buf);

/* chiudo la connessione con il client */
close(connection_fd);

}
}
17 changes: 17 additions & 0 deletions RETI/andruetto_lorenzo/socket_API/andruetto_es1_byte_order.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
#include <stdio.h>
#include <arpa/inet.h>

void main() {
printf("Primo array di numeri:\n");
int numbers[] = {1000, 12890, 54163, 34012, 62984};

for(int i = 0; i < 5; i++)
printf("0x%x\n", htons(numbers[i]));

int arr[] = {19875, 5499, 59821, 43120, 26489};

printf("\nSecondo array di numeri:\n");

for(int i = 0; i < 5; i++)
printf("0x%x\n", ntohs(arr[i]));
}