c-在循环中不断检查共享内存是否发生变化



我有一个循环,它总是为true,以允许其他客户端连接。我遇到的问题是,我如何不断检查共享内存,看看它是否发生了变化,以知道什么时候该关闭服务器?我放入的while循环可以工作,但之后不会让任何其他客户端连接。问题是,在while(1)循环中,它必须等待另一个客户端连接才能通过该循环,但我需要它始终检查共享内存,而不仅仅是在另一个客户机连接时。

    #include <sys/types.h>
    #include <netinet/in.h>
    #include <sys/socket.h>
    #include <errno.h>
    #include <stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <strings.h>
    #include <sys/ipc.h>
    #include <sys/shm.h>
    #include <sys/wait.h>
    struct sockaddr_in sn;
    struct sockaddr from;
    int main(int ac, char** other){
      int s, ns, sl, x = 22, pid;
      char b[256];
      key_t key=137; 
      int size=1;
      int shmflg=0;
      int id=0,ok=0;
      char shmstr[10];
      char istr[10];
      int *shmptr;
      size=size*sizeof(int);
      shmflg=IPC_CREAT | SHM_R | SHM_W;
      id=shmget(key,size,shmflg);
      sprintf(shmstr,"%d",id);
      shmptr=shmat(id,0,0);
      shmptr[0]=0;
      s=socket(AF_INET, SOCK_STREAM,0);
      if (s<0) {
        printf("server socket errorn");
         exit(0);}
      else {}
      bzero((char *)&sn, sizeof(sn));
      sn.sin_family = AF_INET;
      sn.sin_port = htons(3311);
      if (bind(s,(struct sockaddr *)&sn,sizeof(sn))==-1){
        printf("server bind error %dn",errno);
        exit(0);}
      else {}
      listen(s,3);
   ////////////////////////////////////****************************************
      while (1){
        sl=sizeof(from);
        ns =accept(s,&from,&sl);
        if (ns <0) {
          printf("server accept error");
          exit(0);}
        else {}
        sprintf(b,"%d",ns);
        if ((pid=fork()) == 0) {
          sprintf(istr, "%d",ok);
          execlp(other[1], other[1], b, shmstr, istr, (char*) NULL);
        }
        else {
          while(shmptr[0]==0){}//allows the server to shut down but no more clients connect
            close(s);
            exit(0);
          }  
        }
       } 
    ////////////////////////////////////////////*************************
      close(s);
      return 0;
    }

如果我理解正确的话,非阻塞套接字就是您想要的。

[编辑:]使用select

http://www.scottklement.com/rpg/socktut/nonblocking.html

非阻塞套接字也可以与select()结合使用API事实上,如果你达到了一个你真正想等待的地步以前标记为"非阻塞"的套接字上的数据可以通过首先调用select()来模拟阻塞recv(),然后是recv()。

最新更新