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 + -
显示快捷键?