codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <pthread.h>
#include <netinet/in.h>
#include <netdb.h>
#define MAXSIZE 32
#define TWO 2
#define PORT 54322
#define SOCKET int
#define SOCKADDR const struct sockaddr
#define SOCKET_ERROR ((int)-1)
#define LOCALHOST 127.0.0.1
#define MAX_CONNECTION 10
// colori
#define rosso "\e[31m"
#define giallo "\e[33m"
#define verde "\e[32m"
typedef struct
{
char *data;
unsigned long tid;
} Message;
char error_msg[MAXSIZE];
void server(void *args)
{
printf(rosso"\nServer\n"verde);
// Preparo variabili
Message *tosnd = (Message*) args;
Message *torcv;
int ris, optVal, len, newSock, byteSend, byteRecv;
SOCKET ssock, AcceptSocket;
struct sockaddr_in service, cli;
// Creo socket
printf(rosso"socket()\n"verde);
ssock = socket(AF_INET, SOCK_STREAM, 0);
if (ssock == SOCKET_ERROR)
{
printf(rosso"socket() failed\n"verde);
perror(error_msg);
_exit(-1);
}
// Rendo il socket riutilizzabile
printf(rosso"setsockopt()\n"verde);
optVal = 1;
ris = setsockopt(ssock, SOL_SOCKET, SO_REUSEADDR, &optVal, sizeof(optVal));
if (ris == SOCKET_ERROR)
{
printf (rosso"setsockopt() SO_REUSEADDR failed\n"verde);
perror(error_msg);
_exit(-1);
}
// Assegno indirizzo e porta alla socket
printf(rosso"bind()\n"verde);
memset(&service, 0, sizeof(service));
service.sin_family = AF_INET;
service.sin_addr.s_addr = inet_addr("LOCALHOST");
service.sin_port = htons(PORT);
ris = bind(ssock, (SOCKADDR*)&service, sizeof(service));
if (ris == SOCKET_ERROR)
{
printf(rosso"bind() failed\n"verde);
perror(error_msg);
_exit(-1);
}
// Setto il socket all'ascolto
printf(rosso"listen()\n"verde);
ris = listen(ssock, MAX_CONNECTION);
if (ris == SOCKET_ERROR)
{
printf(rosso"listen() failed\n"verde);
perror(error_msg);
_exit(-1);
}
// Attendo richieste di connessioni
printf(rosso"accept()\n"verde);
memset(&AcceptSocket, 0, sizeof(AcceptSocket) );
len = sizeof(AcceptSocket);
newSock = accept(ssock, (struct sockaddr*) &cli, &len);
if (newSock == SOCKET_ERROR)
{
printf(rosso"accept() failed"verde);
perror(error_msg);
_exit(-1);
}
// Attendo dati
printf(rosso"read()\n"verde);
byteRecv = read(newSock, &torcv, sizeof(Message));
if (byteRecv < 0)
{
printf(rosso"read() failed\n"verde);
perror(error_msg);
_exit(-1);
}
printf(rosso">>> 1 Message!\n--> From TID %u Text: %s\n"verde, torcv->tid, torcv->data);
// Invio i dati
printf(rosso"write()\n"verde);
tosnd->data = "Hi, I'm the server";
tosnd->tid = pthread_self();
byteSend = write(newSock, &tosnd, sizeof(Message));
if (byteSend < 0)
{
printf(rosso"write() failed\n"verde);
perror(error_msg);
_exit(-1);
}
printf(rosso"server send %ld bytes\n"verde, byteSend);
// Chiusura socket
printf (rosso"close()\n"verde);
close(ssock);
close(newSock);
}
void client(void *args)
{
printf(giallo"\nClient\n"verde);
// Preparo variabili
Message *tosnd = (Message*) args;
Message *torcv;
int ris, len, byteSend, byteRecv;
SOCKET csock, AcceptSocket;
struct sockaddr_in clientService, cli;
// Creo socket
csock = socket(AF_INET, SOCK_STREAM, 0);
if (csock == SOCKET_ERROR)
{
printf(giallo"socket() failed\n"verde);
perror(error_msg);
_exit(-1);
}
// Mi collego al socket del thread server
printf(giallo"connect()\n"verde);
clientService.sin_family = AF_INET;
clientService.sin_addr.s_addr = inet_addr("LOCALHOST");
clientService.sin_port = htons(PORT);
ris = connect(csock, (SOCKADDR*)&clientService, sizeof(clientService));
if (ris == SOCKET_ERROR)
{
printf(giallo"connect() failed\n");
perror(error_msg);
_exit(-1);
}
fflush(stdout);
// Invio i dati
printf(giallo"write()\n"verde);
fflush(stdout);
tosnd->data = "Hi, I'm the client";
tosnd->tid = pthread_self();
byteSend = write(csock, tosnd, sizeof(Message));
if (byteSend < 0)
{
printf(giallo"write() failed\n"verde);
perror(error_msg);
_exit(-1);
}
printf(giallo"client send %ld bytes\n"verde, byteSend);
// Attendo dati
printf(rosso"read()\n"verde);
byteRecv = read(csock, &torcv, sizeof(Message));
if (byteRecv < 0)
{
printf(rosso"read() failed\n"verde);
perror(error_msg);
_exit(-1);
}
printf(giallo">>> 1 Message!\n--> From TID %u Text: %s\n"verde, torcv->tid, torcv->data);
fflush(stdout);
// Chiudo socket
close(csock);
}
int main(int argc, char** argv)
{
pthread_t thread1, thread2;
Message *msg1, *msg2;
// Primo thread sara' il server
int rc1 = pthread_create(&thread1, NULL, (void*)&server, (void*)msg1);
if(rc1 != 0)
{
perror(verde"*** Main: pthread_create() failed ***\n");
exit(1);
}
printf(verde"*** Main: Thread1 created! ***\n");
// Secondo thread sara' il client
int rc2 = pthread_create(&thread2, NULL, (void*)&client, (void*)msg2);
if(rc2 != 0)
{
perror(verde"*** Main: Main: pthread_create() failed ***\n");
exit(1);
}
printf(verde"*** Main: Thread2 created! ***\n");
pthread_join(thread1, NULL);
pthread_join(thread2, NULL);
printf(verde"*** Main: End! ***\n");
fflush(stdout);
_exit(0);
}