/* Unix domain socket: server. */ #include #include #include #include #include #include #include #include "common.h" #define SOCKET_PATH "./sock.unix" int main( int argc, char* argv[] ) { int s_fd, c_fd; struct sockaddr_un saddr ; socklen_t s_addr_len = sizeof(struct sockaddr_un); fd_set sock_set; struct timeval tm; char *path; struct inf_t data; time_t start; /* Set server's data. */ start = time(NULL); set_id( &data ); if( argc > 1 ) path = argv[1]; else path = SOCKET_PATH; /* Set timout. */ tm.tv_sec = 1; tm.tv_usec = 0; /* Create UDS. */ massert((s_fd = socket( AF_UNIX, SOCK_STREAM, 0)) < 0 , "socket: " ); memset( &saddr, 0, sizeof(saddr)); saddr.sun_family = AF_UNIX; snprintf( saddr.sun_path, 108 , path); unlink(path); massert( bind(s_fd,(struct sockaddr*)&saddr, s_addr_len) < 0, "bind: " ); massert( listen( s_fd, SOMAXCONN ) < 0, "listen: " ); while( 1 ) { update_inf( &data, start ); FD_CLR( s_fd, &sock_set ); FD_SET( s_fd, &sock_set ); massert(select(s_fd+1, &sock_set, NULL, NULL, &tm) < 0, "select:"); if( FD_ISSET( s_fd, &sock_set)) { massert( (c_fd = accept(s_fd, NULL, NULL)) < 0, "accept:" ); massert( send(c_fd, &data, sizeof(struct inf_t), 0) < 0, "send: "); close(c_fd); } } return 0; }