【发布时间】:2015-01-07 15:26:04
【问题描述】:
这是我的场景:我的服务器应该同时使用套接字和fork() 处理两个客户端。服务器与两个客户端共享 same int 数组 data[] ,随机获得。如果data[2] 是一个精确的数字,client1 会执行它的工作并将其工作重新发送到服务器,否则 client2 会执行它的工作 ecc。这将继续无限循环,直到服务器端 CTRL+C 信号。
我认为我的问题出在我写的这个服务器 sn-p 上:
//...
while (1) {
printf("\n*****server waiting for new client connection:*****\n");
msgsock=accept(sock,(struct sockaddr *)&client,(socklen_t *)&lenght);
if(msgsock == -1){
perror("accept");
exit(-1);}
pid = fork();
if (pid == 0){
do{
srand((unsigned) time(&t));
data[0] = rand() %15;
data[1] = rand() %10;
data[2] = rand() %2;
printf("I wrote %d %d %d\n", data[0], data[1], data[2]);
if(write(msgsock,data,sizeof(data))<0){
perror("writing message");}
if(read(msgsock,data2,sizeof(data))<0){ //read the result from client
perror("reading message");}
printf("Result is %d\n", data2[3]);}
while(1);
exit(0);}
这一次只适用于一个客户端,一旦我运行第二个客户端,它就会创建一个新的孩子并且只处理较新的客户端。我希望根据每个循环中data[2] 的内容为两个客户端提供服务。
提前致谢。
编辑:
我不能使用共享内存或类似的东西和线程,只能使用套接字和信号量。 fork 的使用只是我试图解决这个练习的一个想法。
【问题讨论】:
-
read(msgsock,data2,sizeof(data))看起来很可疑,你不是说sizeof(data2)吗? -
如果你想让它在两个分支上运行,
if (pid == 0)有什么意义? -
至于你的问题,你可能想用线程来代替?还是共享内存?
-
我认为你不应该使用
exit(0),而是使用_exit(0)。 -
如果你想分享东西,请考虑不要使用 fork 模型。按照今天的标准,它已经过时了。
标签: c sockets client-server fork