【发布时间】:2013-01-31 06:42:16
【问题描述】:
我想为 unix 制作一个简单的聊天应用程序。 我创建了一台支持多个客户端的服务器。每当有新客户端连接到服务器时,就会使用 fork 命令创建一个新进程。现在的问题是所有子进程在服务器上共享相同的标准输入,因此为了向第二个客户发送消息,第一个子进程必须终止。为了解决这个问题,我想在新终端中运行每个子进程。 这可以通过在新文件中编写子进程代码的代码并像 xterm -e sh -c 一样执行它来实现。(虽然我没有尝试过)。
我真正想要的不是有两个文件只是为了启动一个新终端并运行其中的其余代码。
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;
}
【问题讨论】:
-
从
stdin读取时,是否应该将该输入发送到所有连接的客户端?您是否考虑过线程而不是进程? -
是的,这是一个示例程序。我肯定会转向线程。就从标准输入的读取而言,会发生什么情况是标准输入的数据进入第一个连接一次的客户端,只有在你输入任何内容时才会终止,然后它才会进入嵌套客户端。
标签: c sockets unix multiprocessing unix-socket