socket.c
来自「CS架构的多平台的GUI系统」· C语言 代码 · 共 612 行 · 第 1/2 页
C
612 行
s_sockaddr_t client; socklen_t client_len = sizeof(client); s = s_socket_api_accept(soc, (s_sockaddr_t *) &client, &client_len); if (s < 0) { debugf(DSER | DSYS, "Can not accept new connection"); return -1; } debugf(DSER, "Accepted new connection"); id = s_server_id_get(); if (id != -1) { server->client[id].soc = s; server->client[id].pid = -1; s_pollfd_init(&pfd); pfd->fd = s; pfd->pf_in = s_server_socket_client_in_f; pfd->pf_err = s_server_socket_client_ierr_f; s_pollfd_add(server->window, pfd); debugf(DSER, "Client[%d] connection established", id); return 0; } debugf(DSER, "MAX amounts of clients reached, closing requesting socket"); s_server_socket_listen_window_close(s); return -1;}int s_server_socket_request_event (int id){ s_socket_send(server->client[id].soc, &server->window->event->type, sizeof(S_EVENT)); if (server->window->event->type & MOUSE_EVENT) { s_socket_send(server->client[id].soc, server->window->event->mouse, sizeof(s_mouse_t)); } if (server->window->event->type & KEYBD_EVENT) { s_socket_send(server->client[id].soc, server->window->event->keybd, sizeof(s_keybd_t)); } return 0;}int s_server_socket_request_close (int id){ debugf(DSER, "Close request sent to Client[%d]", id); return 0;}int s_server_socket_request_expose (int id, s_rect_t *changed){ int pri = s_server_id_pri(id); s_socket_send(server->client[id].soc, &server->client[id].buf, sizeof(s_rect_t)); s_socket_send(server->client[id].soc, &server->client[id].win, sizeof(s_rect_t)); s_socket_send(server->client[id].soc, &pri, sizeof(int)); s_socket_send(server->client[id].soc, changed, sizeof(s_rect_t)); s_socket_send(server->client[id].soc, &server->window->surface->linear_buf_width, sizeof(int)); s_socket_send(server->client[id].soc, &server->window->surface->linear_buf_pitch, sizeof(int)); s_socket_send(server->client[id].soc, &server->window->surface->linear_buf_height, sizeof(int)); return 0;}int s_server_socket_request_desktop (int id){ int i; int l; int p; int count = 0; for (i = 0; i < S_CLIENTS_MAX; i++) { if (s_server_id_pri(i) >= 0) { if (!(server->client[i].type & WINDOW_TEMP)) { count++; } } } s_socket_send(server->client[id].soc, &count, sizeof(int)); for (i = 0; i < S_CLIENTS_MAX; i++) { if ((p = s_server_id_pri(i)) >= 0) { if (!(server->client[i].type & WINDOW_TEMP)) { l = strlen(server->client[i].title.str); s_socket_send(server->client[id].soc, &i, sizeof(int)); s_socket_send(server->client[id].soc, &p, sizeof(int)); s_socket_send(server->client[id].soc, &l, sizeof(int)); s_socket_send(server->client[id].soc, server->client[i].title.str, l); } } } return 0;}int s_server_socket_request (S_SOC_DATA req, int id, ...){ va_list ap; int ret = 0; s_rect_t *changed; struct pollfd pollfd; if (server->window->running <= 0) { return -1; } if (id == -1) { return -1; } if (server->client[id].soc < 0) { return -1; } pollfd.fd = server->client[id].soc; pollfd.events = POLLOUT; pollfd.revents = 0; if (s_socket_api_poll(&pollfd, 1, 1000) <= 0) { goto err; } if (pollfd.revents & (POLLERR | POLLHUP | POLLNVAL)) { /* socket_listen will take over we dont handle here, to avoid the recursiveness of pri_set_ */ return -1; } if (pollfd.revents != POLLOUT) {err: debugf(DSER, "Error occured when requesting (%d) from client[%d]. Closing it [revents: %d]", req, id, pollfd.revents); s_server_socket_listen_window_close(server->client[id].soc); return -1; } s_socket_send(server->client[id].soc, &req, sizeof(req)); switch (req) { case SOC_DATA_EVENT: ret = s_server_socket_request_event(id); break; case SOC_DATA_CLOSE: ret = s_server_socket_request_close(id); break; case SOC_DATA_EXPOSE: va_start(ap, id); changed = (s_rect_t *) va_arg(ap, s_rect_t *); ret = s_server_socket_request_expose(id, changed); va_end(ap); break; case SOC_DATA_DESKTOP: ret = s_server_socket_request_desktop(id); break; case SOC_DATA_NEW: case SOC_DATA_HIDE: case SOC_DATA_SHOW: case SOC_DATA_TITLE: case SOC_DATA_STREAM: case SOC_DATA_DISPLAY: case SOC_DATA_NOTHING: case SOC_DATA_FORMDRAW: case SOC_DATA_CONFIGURE: case SOC_DATA_CONFIGURE_NOFORM: break; } return ret;}int s_server_socket_uninit (s_window_t *window, int soc){ s_socket_api_close(soc);#if defined(IPC_UDS) unlink(S_SERVER_SOC_NAME);#endif return 0;}int s_server_socket_in_f (s_window_t *window, int soc){ return s_server_socket_listen_accept(soc);}int s_server_socket_ierr_f (s_window_t *window, int soc){ return 0;}int s_server_socket_init_uds (void){#if defined(IPC_UDS) int fd; struct sockaddr_un soc = {AF_UNIX, S_SERVER_SOC_NAME}; int len = sizeof(soc.sun_family) + strlen(soc.sun_path); mkdir(S_SERVER_DIR, 0777); unlink(S_SERVER_SOC_NAME); fd = s_socket_api_socket(AF_UNIX, SOCK_STREAM, 0); if (fd < 0) { debugf(DSER | DSYS | DFAT, "Can not open listening socket"); } if (s_socket_api_bind(fd, (s_sockaddr_t *) &soc, len) == -1) { debugf(DSER | DSYS | DFAT, "Can not bind listening socket"); } if (s_socket_api_listen(fd, S_CLIENTS_MAX) == -1) { debugf(DSER | DSYS | DFAT, "Listen socket"); } return fd;#else return -1;#endif}int s_server_socket_init_tcp (void){#if defined(IPC_TCP) int fd; int len; struct sockaddr_in soc; len = sizeof(soc); soc.sin_family = AF_INET; soc.sin_addr.s_addr = htonl(S_SERVER_SOC_ALLOW); soc.sin_port = htons(S_SERVER_SOC_PORT); fd = s_socket_api_socket(AF_INET, SOCK_STREAM, 0); if (fd < 0) { debugf(DSER | DSYS | DFAT, "Can not open listening socket"); } if (s_socket_api_bind(fd, (s_sockaddr_t *) &soc, len) == -1) { debugf(DSER | DSYS | DFAT, "Can not bind listening socket"); } if (s_socket_api_listen(fd, S_CLIENTS_MAX) == -1) { debugf(DSER | DSYS | DFAT, "Listen socket"); } return fd;#else return -1;#endif}int s_server_socket_init_pipe (void){#if defined(IPC_PIPE) int fd; s_sockaddr_t soc = {AF_PIPE, S_SERVER_SOC_PIPE}; int len = sizeof(soc.sa_family) + strlen(soc.sa_addr); fd = s_socket_api_socket(AF_PIPE, SOCK_STREAM, 0); if (fd < 0) { debugf(DSER | DSYS | DFAT, "Can not open listening socket"); } if (s_socket_api_bind(fd, (s_sockaddr_t *) &soc, len) == -1) { debugf(DSER | DSYS | DFAT, "Can not bind listening socket"); } if (s_socket_api_listen(fd, S_CLIENTS_MAX) == -1) { debugf(DSER | DSYS | DFAT, "Listen socket"); } return fd;#else return -1;#endif}void s_server_socket_init (void){ int fd[3]; s_pollfd_t *pfd; if (s_socket_api_init()) { debugf(DSER | DSYS | DFAT, "Sockets API initilization failed!"); } fd[0] = s_server_socket_init_uds(); fd[1] = s_server_socket_init_tcp(); fd[2] = s_server_socket_init_pipe(); if ((fd[0] < 0) && (fd[1] < 0) && (fd[2] < 0)) { debugf(DSER | DFAT, "Could not open any listening socket"); } s_socket_init_wakeup(server->window); if (fd[0] >= 0) { debugf(DSER, "Listening on UDS : %s", S_SERVER_SOC_NAME); s_pollfd_init(&pfd); pfd->fd = fd[0]; pfd->pf_in = s_server_socket_in_f; pfd->pf_err = s_server_socket_ierr_f; pfd->pf_close = s_server_socket_uninit; s_pollfd_add(server->window, pfd); } if (fd[1] >= 0) { debugf(DSER, "Listening on TCP : %s:%d", S_SERVER_SOC_ADDR, S_SERVER_SOC_PORT); s_pollfd_init(&pfd); pfd->fd = fd[1]; pfd->pf_in = s_server_socket_in_f; pfd->pf_err = s_server_socket_ierr_f; pfd->pf_close = s_server_socket_uninit; s_pollfd_add(server->window, pfd); } if (fd[2] >= 0) { debugf(DSER, "Listening on PIPE : %s", S_SERVER_SOC_PIPE); s_pollfd_init(&pfd); pfd->fd = fd[2]; pfd->pf_in = s_server_socket_in_f; pfd->pf_err = s_server_socket_ierr_f; pfd->pf_close = s_server_socket_uninit; s_pollfd_add(server->window, pfd); }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?