LINUX.ORG.RU

Сокеты передача сообщений между компьютерами. Помогите найти ошибку.

 


1

1

Доброго времени суток. Небольшое предисловие: есть кластерная система на 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, с него идет запуск и на него принимаю.

А вы хоть какую-то диагностику провести можете? А то даже не понятно, может у вас сервер рассылает бродакаст до того, как ssh успевает установить соединение и запустить там процесс. А может и броадкаст не рассылается — проверки кода возврата sendto() нету.

Я не знаю и мне не интерестно знать свойства вашего кластера, но может там можно запустить программу через strace и при этом смотреть ходящие по сети пакеты через tcpdump.

mky ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.