Доброго времени суток. Небольшое предисловие: есть кластерная система на 93 noda , подробнее можно тут http://neclus.donntu.edu.ua/ . Yеобходимо передать сообщения с одного компьютера на другой по сети. Написал 2 программы: первая - «родитель», запускает на 2х нодах программки, которые получают через командную строку свои параметры которые я хочу переслать на сервер. вторая - «потомок», которая запускается на нодах и пересылает полученные через командную строку данные на сервер. Возникла проблема не могу обменять сообщения, в чем проблема, может вы подскажите. Листинги ниже. Одновременная отсылка собщений с потомков обязательна. РОДИТЕЛЬ(сервер)
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
void parallel()
{
system("scp c.exe node1:");
system("nohup ssh -X node1 './c.exe node1'&");
system("scp c.exe node2:");
system("nohup ssh -X node2 './c.exe node2'&");
}
int main()
{
int sock;
struct sockaddr_in addr;
char buf[1024];
int bytes_read;
char start[3]="Go";
int i=0;
parallel();
printf("START\n");
sock = socket(AF_INET, SOCK_DGRAM, 0);
if(sock < 0)
{
perror("socket");
exit(1);
}
i=1;
//BROADCAST ENABLE
setsockopt(sock,SOL_SOCKET,SO_BROADCAST,(char*)&i,sizeof(i));
//рассылка широковечащельного сообщения для запуска.
addr.sin_family = AF_INET;
addr.sin_port = htons(3425);
addr.sin_addr.s_addr=htonl(INADDR_BROADCAST);
sendto(sock, start, sizeof(start), 0, (struct sockaddr *)&addr, sizeof(addr));
i=0;
//привязка к порту 3425 для 10.148.0.254
addr.sin_family = AF_INET;
addr.sin_port = htons(3425);
inet_aton("10.148.0.254",&addr.sin_addr);//10.148.0.254
if(bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0)
{
perror("bind");
exit(2);
}
while(i!=2)//прием сообщений от двух процессов, должно прийти node1 И node2
{
bytes_read = recvfrom(sock, buf, 1024, 0, NULL, NULL);
buf[bytes_read] = '\0';
printf(buf);
i++;
}
close(sock);
return 0;
}
ПОТОМОК
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
int sock;
struct sockaddr_in addr;
char buf[3];
int bytes_read;
char addrr[]="10.148.0.";
char start[80];
char ad;
int i=0;
strcpy(start,argv[1]);
sock = socket(AF_INET, SOCK_DGRAM, 0);
if(sock < 0)
{
perror("socket");
exit(1);
}
bzero(&addr,sizeof(addr));
//привязка к порту 3425 для любого адреса
i=1;
setsockopt(sock,SOL_SOCKET,SO_BROADCAST,(char*)&i,sizeof(i));
addr.sin_family = AF_INET;
addr.sin_port = htons(3425);
strcat(addrr,&start[4]);
inet_aton(addrr,&addr.sin_addr);
if(bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0)
{
perror("bind");
exit(2);
}
while(buf[0]!='G' && buf[1]!='o')
{
bytes_read = recvfrom(sock, buf, 3, 0, NULL, NULL);
buf[bytes_read] = '\0';
printf(buf);
}
addr.sin_family = AF_INET;
addr.sin_port = htons(3425);
inet_aton("10.148.0.254",&addr.sin_addr);
sendto(sock, start, sizeof(start), 0, (struct sockaddr *)&addr, sizeof(addr));
close(sock);
return 0;
}
адреса нодов соответственно 10.148.0.1-10.148.0.93, сервер 10.148.0.254, с него идет запуск и на него принимаю.