UNIX用の簡単なチャットアプリケーションを作りたいです。複数のクライアントをサポートする 1 つのサーバーを作成しました。新しいクライアントがサーバーに接続するたびに、fork コマンドを使用して新しいプロセスが作成されます。問題は、すべての子プロセスがサーバー上で同じ stdin を共有していることです。このため、2 番目のクライアントにメッセージを送信するには、1 番目の子プロセスを終了する必要があります。これを解決するために、各子プロセスを新しいターミナルで実行したいと思います。これは、子プロセス コードのコードを新しいファイルに記述し、 xterm -e sh -c のように実行することで実現できます (ただし、これは試していません)。
私が本当に望んでいるのは、新しい端末を起動して残りのコードを実行するためだけに2つのファイルを持たないことです。
int say(int socket)
{
char *s;
fscanf(stdin,"%79s",s);
int result=send(socket,s,strlen(s),0);
return result;
}
int main()
{
int listener_d;
struct sockaddr_in name;
listener_d=socket(PF_INET,SOCK_STREAM,0);
name.sin_family=PF_INET;
name.sin_port=(in_port_t)htons(30000);
name.sin_addr.s_addr=htonl(INADDR_ANY);
int c = bind(listener_d,(struct sockaddr *)&name,sizeof(name)); //Bind
if(c== -1)
{
printf("\nCan't bind to socket\n");
}
if(listen(listener_d,10) == -1) // Listen
{
printf("\nCan't listen\n");
}
puts("\nWait for connection\n");
while(1)
{
struct sockaddr_storage client_addr;
unsigned int address_size = sizeof(client_addr);
int connect_d = accept(listener_d,
(struct sockaddr*)&client_addr,&address_size); //Accept
if(connect_d== -1)
{
printf("\nCan't open secondary socket\n");
}
if(!fork())
{
close(listener_d);
char *msg = "welcome Sweetone\n";
if(send(connect_d,msg,strlen(msg),0))
{
printf("send");
}
int k=0;
while(k<5)
{
say(connect_d);
++k;
}
close(connect_d);
exit(0);
}
close(connect_d);
}
close(listener_d);
return 0;
}