• unix socket服务器


    只能处理单个消息,一发一收。

    int loop(void) {   struct sockaddr_un client_addr;  int server_socket, client_socket;  socklen_t len;  struct message msg;  struct answer ans;  fd_set fds, fds_bak;  int maxfd, index, ret = 0;  bool fresh = TRUE;  pthread_t read_thread = 0;  pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

     server_socket = socket_local_server(SOCKET_PATH, SOCK_STREAM);  if (server_socket == FALSE) {   pthread_mutex_destroy(&mutex);   return FALSE;  }

     maxfd = server_socket;  FD_ZERO(&fds);  FD_ZERO(&fds_bak);  FD_SET(server_socket, &fds_bak);

     len = sizeof(client_addr);  while (1) {   fds = fds_bak;   struct timeval timeout = { 0, 50000 /* 50ms */ };   maxfd = update_maxfd(fds, maxfd);

      ret = select(maxfd + 1, &fds, NULL, NULL, &timeout);   if (ret == 0 || (ret == -1 && errno == EINTR)) {    continue;   } else if (ret < 0) {    PRT("socket selectting failed(%s). ", strerror(errno));    goto fail;   }

      for (index = 0; index <= maxfd; index++) {    if (!FD_ISSET(index, &fds))     continue;

       if (index == server_socket) {     client_socket = accept(server_socket, (struct sockaddr *)&client_addr,           &len);     if (client_socket < 0) {      PRT("accept client failed(%s). ", strerror(errno));      goto fail;     }     set_socket_nonblock(client_socket);     if (client_socket > maxfd) {      maxfd = client_socket;     }     FD_SET(client_socket, &fds_bak);    } else {     memset((HI_VOID *)&msg, 0, sizeof(struct message));     if ((read(client_socket, (HI_VOID *)&msg,      sizeof(struct message))) != sizeof(struct message)) {      close(server_socket);      close(client_socket);      pthread_mutex_destroy(&mutex);      return HI_FAILURE;     } else {      /*process recvmsg and sendback result*/                  if ((write(client_socket, (HI_VOID *)&ans,       sizeof(struct answer))) != sizeof(struct answer)) {       close(server_socket);       close(client_socket);       pthread_mutex_destroy(&mutex);       return HI_FAILURE;      }      close(client_socket);      FD_CLR(index, &fds_bak);     }    }   }  } }

  • 相关阅读:
    内部类概述和访问特点
    权限修饰符 权限
    抽象类和接口作为返回值类型的问题
    抽象类和接口作为形参问题
    jdbc:java数据库连接
    类与类、类与接口、接口与接口的关系
    接口
    抽象类
    多态
    继承中构造方法的关系
  • 原文地址:https://www.cnblogs.com/qihualin-1024/p/10370072.html
Copyright © 2020-2023  润新知