RISOLTO.
Ad imperitura memoria posto il codice del client e del server.
L'import basic.h naturalmente raccoglie tutti gli import e definisce macro come BACKLOG (che ha valore 5) quindi una volta copiate questi codici andranno aggiunti a mano gli include necessari.
client.c
/*
* Numerato_client.c
*
* Created on: 12/gen/2015
* Author: Carlo1983
*/
#include "basic.h"
void messaggio(int);
int main(int argc, char *argv[]) {
int connsock;
struct sockaddr_in servsock;
socklen_t socklen;
if (argc != 3) {
printf(
"Utilizzo del programma \"Numerato_client\" <#indirizzo> <#porta>\n");
return 0;
}
//Popolo la struttura server:
bzero(&servsock, sizeof(struct sockaddr));
servsock.sin_family = AF_INET;
servsock.sin_port = htons(atoi(argv[2]));
socklen = sizeof(struct sockaddr);
//Converto l'indirizzo passato dal client in indirizzo in formato web:
if (inet_pton(AF_INET, argv[1], &servsock.sin_addr) != 1) {
printf("Errore nella funzione INET_PTON()!\n");
exit(-1);
}
if ((connsock = socket(AF_INET, SOCK_STREAM, 0)) <= 0) {
printf("Errore nella funzione SOCKET()!\n");
exit(-1);
}
if (connect(connsock, (struct sockaddr *) &servsock, socklen) != 0) {
printf("Errore nella funzione CONNECT()!\n");
exit(-1);
}
messaggio(connsock);
return 0;
}
void messaggio(int connsock) {
char mess[MAXLINE];
bzero(&mess, sizeof(mess));
/*
QUI LA VOSTRA FUNZIONE PER RICEVERE L'INTERO DAL SOCKET
*/
printf("Io sono il server %s\n", &mess);
if (close(connsock) != 0) {
printf("Errore nella funzione CLOSE()!\n");
exit(-1);
}
}
//FINE CLIENT//
server.c
/*
* Numerato_server.c
*
* Created on: 12/gen/2015
* Author: carlo
*/
#include "basic.h"
void numera(int, int);
int main(int argc, char *argv[]){
int listfd, connfd, pid, i = '0';
socklen_t socklen;
struct sockaddr_in clisock, sersock;
//Popolo la struttura sockaddr:
bzero(&sersock, sizeof(sersock));
sersock.sin_family = AF_INET;
sersock.sin_addr.s_addr = INADDR_ANY;
sersock.sin_port = htons(atoi(argv[1]));
socklen = sizeof(struct sockaddr);
if(argc != 2){
printf("Utilizzo del programma:\n\tserver <#porta>\n");
return 0;
}
if((listfd = socket(AF_INET, SOCK_STREAM, 0)) <= 0){
printf("Errore nella funzione SOCKET()!\n");
exit(-1);
}
if(bind(listfd, (struct sockaddr *) &sersock, socklen) != 0){
printf("Errore nella funzione BIND()!\n");
exit(-1);
}
if(listen(listfd, BACKLOG) != 0){
printf("Errore nella funzione LISTEN()!\n");
exit(-1);
}
for(;{
if((connfd = accept(listfd, (struct sockaddr *) &clisock, &socklen)) <= 0){
printf("Errore nella funzione ACCEPT()!\n");
exit(-1);
}
i = i + 1; //QUI i VALE 1
printf("%c\n", i);
if((pid = fork()) == 0){ //FIGLIO
if(close(listfd) != 0){ //Senza il contatore sballa!
printf("Errore nella funzione CLOSE(listfd)!\n");
exit(-1);
}
numera(connfd, i);
if(close(connfd) != 0){
printf("Errore nella funzione CLOSE(connfd)!\n");
exit(-1);
}
return 0;
}
else if(pid > 0){ //PADRE
if(close(connfd) != 0){
printf("Problema nella funzione CLOSE() del padre!\n");
exit(-1);
}
}
else{
printf("Errore nella funzione FORK()!\n");
exit(-1);
}
}
return 0;
}
void numera(int connfd, int n){
/*
QUI LA FUNZIONE CHE SCRIVE L'INTERO SUL SOCKET
*/
printf("La fork() contiene %c\n", n);
bzero(&n, sizeof(n));
}
//FINE SERVER//
Spero possa essere d'aiuto.
Alla prossima.