使用C套接字使同一本地计算机上的多个进程相互通信

时间:2018-10-23 18:50:22

标签: c multithreading sockets client-server fork

我正在一个学期项目中工作,在该项目中,我必须在一台计算机上模拟多个进程(用户输入了多个进程),这些进程以分布式方式进行一些有用的计算并使用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);
}

尽管代码看起来不错,但是客户端从未连接到服务器。客户端不连接到服务器,并且该过程不会终止。这是我每次得到的输出。enter image description here

如果有人愿意回答,那将是很大的帮助。预先非常感谢。

0 个答案:

没有答案