我正在一个学期项目中工作,在该项目中,我必须在一台计算机上模拟多个进程(用户输入了多个进程),这些进程以分布式方式进行一些有用的计算并使用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
如果有人愿意回答,那将是很大的帮助。预先非常感谢。