Ok, dunque provo inanzitutto a descrivere brevemente la situazione.
Si tratta di un progetto p2p per lo scambio di file tra peer (torrent like)
In particolare, ho un Bootstrap sempre attivo che fa da governance, ossia "accoglie" i nuovi nodi (peer) che entrano nella rete. I peer fanno riferimento a dei superpeer.
Mi sembra che al mio collega dava errore anche in fase di entrata di un nuovo nodo (peer/superpeer) nella rete.
Posto dunque codice di quella parte
Bootstrap:
void avviaBootstrap(int BOOTSTRAP_PORT) {
if ((server_sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("errore in socket");
exit(1);
}
int reuse0=1;
int status = 0;
status =setsockopt(server_sockfd, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse0, sizeof(reuse0));
if (-1 == status)
{
perror("setsockopt(...,SO_REUSEADDR,...)");
}
memset((void *) &server_address, 0, sizeof(server_address));
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = htonl(INADDR_ANY);
server_address.sin_port = htons(BOOTSTRAP_PORT);
if ((bind(server_sockfd, (struct sockaddr *) &server_address,
sizeof(server_address))) < 0) {
perror("errore in bind");
exit(1);
}
if (listen(server_sockfd, BACKLOG) < 0) {
perror("errore in listen");
exit(1);
}
for (;;) {
printf("server waiting...\n");
client_len = sizeof(client_address);
if ((client_sockfd = accept(server_sockfd,
(struct sockaddr *) &client_address, &client_len)) < 0) {
perror("errore in accept");
exit(1);
}
bytecount = recv(client_sockfd, buff, BUFLEN - 1, 0);
if (bytecount == -1) {
perror("recv");
exit(1);
}
buff[bytecount] = '\0';
strcpy(MSG_ricevuto, buff);
printf("MSG Received lato boot: \"%s\"\n", MSG_ricevuto);
gestione_messaggiBootstrap(MSG_ricevuto);
printf("arrayGlobal : %s\n",arrayGlobal);
if (send(client_sockfd, arrayGlobal, strlen(arrayGlobal) + 1, 0)
== -1) {
perror("send");
exit(1);
}
}
}
La funzione gestione_messaggiBootstrap:
void gestione_messaggiBootstrap(char stringa[MAX_STRING_LEN]) {
MYSQL mysql;
MYSQL_ROW row;
MYSQL_RES* result;
MYSQL_FIELD* field;
int pos5, stlun;
char ssss[200];
int i = 0;
stlun = strlen(stringa);
for (i = 0; i < stlun - 1; i++) {
ssss[i] = 'z';
}
for (i = 0; i < stlun - 1; i++) {
char* appo = substring(stringa, i, 1);
if (appo)
ssss[i] = *appo;
}
for (i = 0; i < stlun - 1; i++) {
printf("elem %c\n", ssss[i]);
}
pos5 = 0;
stlun = 0;
pos5 = five_pos(ssss);
stlun = strlen(stringa);
int begin1 = 0;
int end1 = 2;
char* comando = substring(stringa, begin1, end1);
int begin2 = 4;
int end2 = 1;
char* nodo = substring(stringa, begin2, end2);
int begin3 = 7;
int end3 = pos5 - 7;
printf("pos5 %i", pos5);
char* ip = substring(stringa, begin3, end3);
int begin4 = pos5 + 2;
int end4 = 4;
char* porta = substring(stringa, begin4, end4);
int portai;
portai = atoi(porta);
int begin5 = pos5 + 8;
int end5 = stlun - begin5;
char* altro = substring(stringa, begin5, end5);
printf("comando = %s\n", comando);
printf("nodo = %s\n", nodo);
printf("ip = %s\n", ip);
printf("porta = %s\n", porta);
printf("altro = %s\n", altro);
if (strcmp(comando, "/J") == 0) {
printf("devo gestire join");
if (strcmp(nodo, "S") == 0) {
printf(" join superpeer");
gest_join_superpeer(ip, portai, altro);
}
else if(strcmp(nodo, "P") == 0) {
printf("devo gestire Join Peer");
gest_join_peer(ip, portai, altro);
}
}
else if(strcmp(comando,"/B")==0)
{
gest_join_bis(ip,portai,altro);
}
}
Invece, lato superpeer la funzione per contattare il Bootstrap ed entrare nella rete:
void client(char* ipLocale, char* ipDestinatario, int BOOTSTRAP_PORT) {
int sockfd;
struct sockaddr_in servaddr;
int bytecount;
char buff[MAXLINE];
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("errore in socket");
exit(1);
}
memset((void *) &servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(BOOTSTRAP_PORT);
if (inet_pton(AF_INET, ipDestinatario, &servaddr.sin_addr) <= 0) {
fprintf(stderr, "errore in inet_pton per %s\n", ipDestinatario);
exit(1);
}
if (connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0) {
perror("errore in connect");
exit(1);
}
if (send(sockfd, ritorno, strlen(ritorno) + 1, 0) == -1) {
perror("send");
exit(1);
}
bytecount = recv(sockfd, buff, BUFLEN - 1, 0);
if (bytecount == -1) {
perror("recv");
exit(1);
}
buff[bytecount] = '\0';
strcpy(MSG_ricevuto, buff);
if(strcmp(buff,"ACK&&ACK")==0){
printf("connessione avvenuta!! \n");
}
}