不断检查共享内存以便在循环中进行更改

时间:2014-04-24 20:37:37

标签: c sockets loops shared-memory

我有一个循环,总是允许其他客户端连接。我遇到的问题是如何不断检查共享内存以查看它是否发生变化以了解何时关闭服务器?我投入的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 error\n");
         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 %d\n",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;
    }

1 个答案:

答案 0 :(得分:1)

如果我理解正确,那么非阻塞套接字就是你要找的。

[编辑:] 使用select

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

  

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