Я работаю над своим семестровым проектом, в котором мне нужно смоделировать несколько процессов на одном компьютере (количество процессов вводится пользователем), которые выполняют некоторые полезные вычисления распределенным образом и общаются друг с другом, используя сокеты 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);
}
Хотя, кажется, код в порядке, но клиенты никогда не подключаются к серверу.Клиенты не подключаются к серверу, и процесс не прекращается.Вот вывод, который я получаю каждый раз. введите описание изображения здесь
Если кто-нибудь затруднит ответить, это будет отличной помощью.Заранее большое спасибо.