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).\n", 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).\n", 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);     }    }   }  } }

上一篇:Visual Studio 2015 与GitLab 团队项目与管理【2】


下一篇:POJ3111 K Best(另类背包+二分+变态精度)