Заставить несколько процессов на одном локальном компьютере взаимодействовать друг с другом с помощью сокетов C - PullRequest
0 голосов
/ 23 октября 2018

Я работаю над своим семестровым проектом, в котором мне нужно смоделировать несколько процессов на одном компьютере (количество процессов вводится пользователем), которые выполняют некоторые полезные вычисления распределенным образом и общаются друг с другом, используя сокеты C.Я буду использовать системный вызов fork () для создания столько процессов, сколько пользователь хочет создать.

Здесь, в коде, я пытаюсь сделать это на двух процессах.Здесь процесс создает другой процесс, используя fork (), и затем они пытаются общаться друг с другом.Каждый процесс (P0, P1) будет иметь серверный поток и клиентский поток.Клиент P0 отправит сообщение на сервер P1, а клиент P1 отправит сообщение на сервер P0.Вот мой код.

int arr_of_ports[3]={7000,7001};
int P_ID;
void *server(void *i)
{
   int sockfd, newsockfd=-1, portno, clilen;
   charenter code here buffer[256];
   struct sockaddr_in serv_addr, cli_addr;    
   int  n;
   sockfd = socket(AF_INET, SOCK_STREAM, 0);                                             
   if(sockfd < 0) 
     {
        perror("ERROR opening socket");                
        pthread_exit(NULL);
     }
   bzero((char *) &serv_addr, sizeof(serv_addr));      
   portno = arr_of_ports[P_ID];                                      
   serv_addr.sin_family = AF_INET;                 
   serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");    
   serv_addr.sin_port = htons(portno);                     
   if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)< 
   0)  
   {                                                                         
      perror("ERROR on binding");
      pthread_exit(NULL);
   }
   listen(sockfd,5);                 
   clilen = sizeof(cli_addr);        
   printf("P%d server waiting for incoming connections \n",P_ID); 
   newsockfd = accept(sockfd, (struct sockaddr *)&cli_addr, (socklen_t 
   *)&clilen);
   printf("server side : connection accepted \n");
   bzero(buffer,256);
   n = read( newsockfd,buffer,255 );
   if (n < 0) 
     {
        perror("ERROR reading from socket");
        pthread_exit(NULL);
     }
   printf("P%d received message: %s\n",P_ID,buffer);
   close(newsockfd);
   pthread_exit(NULL);
}
void *client(void *i)
{
  int *p=(int*)i;
  int to=*p;
  int port_no;
  int client_socket;
  int status=-1;
  char buffer[100]="hello I am ";
  char c=P_ID+'0';
  buffer[11]=c;
  buffer[12]=0;       //to send message like 'hello i am 1' 
  struct sockaddr_in server_addr;
  if((client_socket = socket(AF_INET, SOCK_STREAM, 0)) == 0)
    {   
      printf("socket not created\n");
      pthread_exit(NULL);
    }
  port_no=arr_of_ports[to];      /* gives the server thread a port 
  number according to the ID of its process*/
  server_addr.sin_family = AF_INET;
  server_addr.sin_port = htons(port_no);
  server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
  printf("P%d client trying to connect to server \n",P_ID);
  int atmpt=0;
  status = connect(client_socket, (struct sockaddr*)&server_addr, 
  sizeof(server_addr));
  if(status < 0)
    {
      printf("error connecting to the server \n "); 
      pthread_exit(NULL);
    }
  else
    {
      printf("P%d client connected to server",P_ID);
    }
  write(client_socket,buffer,sizeof(buffer));
  close(client_socket);
  pthread_exit(NULL);

}

int main()
{
  pthread_t t[2];
  int flag=1;
  int count=0;
  for(int i=1;i<2;i++)          //creating one more process
  {
  if(flag>=1)
    {
      flag=fork();
      count++;
       }
   else
     {
       break;
     }
 }  
 /*gives the processes an ID so that their server thread can be bound 
to a port such that the other processes know this server's port*/
if(flag==0)
  P_ID=count;     
else
  P_ID=0;
int rv=pthread_create(&t[0],NULL,server,NULL);  // server thread
int tc=1;
for(int i=0;i<2;i++)
{
  if(i != P_ID)
   {
     int rv=pthread_create(&t[tc],NULL,client,&i);   /*i is the 
   process to which the message is to be sent*/
     tc++;     
   }
}
printf("main thread exited \n ");
pthread_exit(NULL);
}

Хотя, кажется, код в порядке, но клиенты никогда не подключаются к серверу.Клиенты не подключаются к серверу, и процесс не прекращается.Вот вывод, который я получаю каждый раз. введите описание изображения здесь

Если кто-нибудь затруднит ответить, это будет отличной помощью.Заранее большое спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...