int main(int argc, char *argv[]) { init_slog("hw_server", "config/log.cfg", 3, NULL); slog(0, SLOG_INFO, "**************************************************"); slog(0, SLOG_INFO, "HomeWatch Server v1.0, © 2015, Matthew Goulart"); slog(0, SLOG_INFO, "**************************************************"); //Configure buffer to output immediately setvbuf(stdout, 0, _IONBF, 0); //Mysql version and initializations slog(0, SLOG_INFO, "MySQL client version: %s", mysql_get_client_info()); //Initialize the FDs for the sockets int socketfd, clientfd; //Initialize the list of FDs to monitor for input fd_set fdMonitor; //Initialize timer for select() struct timeval select_timeout; select_timeout.tv_sec = 3; select_timeout.tv_usec = 0; //Initialize the thread id pthread_t thread; slog(0, SLOG_INFO, "Starting server..."); slog(0, SLOG_INFO, "Creating listen socket..."); //Create the listen socket socketfd = create_inet_server_socket("0.0.0.0", "5677", LIBSOCKET_TCP, LIBSOCKET_IPv4, 0); if (socketfd < 0) { slog(2, SLOG_ERROR, "Error creating listen socket!"); return -1; } else { slog(0, SLOG_INFO, "Listening..."); } while (1) { FD_ZERO(&fdMonitor); FD_SET(socketfd, &fdMonitor); FD_SET(STDIN_FILENO, &fdMonitor); select_timeout.tv_sec = 3; select_timeout.tv_usec = 0; select(sizeof(fdMonitor) * 8, &fdMonitor, NULL, NULL, &select_timeout); if (FD_ISSET(socketfd, &fdMonitor)) { clientfd = accept_inet_stream_socket(socketfd, 0, 0, 0, 0, 0, 0); pthread_create(&thread, NULL, async_sensor_communicate, clientfd); } } return 0; }
int main(void) { int sfd, bytes, ret; char src_host[128], src_service[7], buf[16]; src_host[127] = 0; src_service[6] = 0; sfd = create_inet_server_socket("0.0.0.0","1234",UDP,IPv4,0); if ( -1 == sfd ) { perror("couldn't create server\n"); exit(1); } printf("Socket up and running\n"); while ( 1 ) { memset(buf,0,16); ret = bytes = recvfrom_inet_dgram_socket(sfd,buf,15,src_host,127,src_service,6,0,NUMERIC); if ( ret < 0 ) { perror(0); exit(1); } ret = sendto_inet_dgram_socket(sfd,buf,bytes,src_host,src_service,0); if ( ret < 0 ) { perror(0); exit(1); } printf("Connection from %s port %s: %s (%i)\n",src_host,src_service,buf,bytes); printf("Connection processed\n"); } ret = destroy_inet_socket(sfd); if ( ret < 0 ) { perror(0); exit(1); } return 0; }
int main(void) { int cfd, sfd, ret; char* buf = calloc(16,1); ret = sfd = create_inet_server_socket("::","55555",LIBSOCKET_TCP,LIBSOCKET_IPv6,0); if ( ret < 0 ) { perror(0); exit(1); } ret = cfd = accept_inet_stream_socket(sfd,0,0,0,0,0,0); if ( ret < 0 ) { perror(0); exit(1); } ret = read(cfd,buf,15); if ( ret < 0 ) { perror(0); exit(1); } printf("%s\n",buf); ret = destroy_inet_socket(sfd); if ( ret < 0 ) { perror(0); exit(1); } return 0; }
int create_multicast_socket(const char* group, const char* port, const char* if_name) { int sfd, return_value; struct sockaddr maddr, localif; struct addrinfo hints, *result; struct ip_mreqn mreq4; struct ipv6_mreq mreq6; struct in_addr any; struct ifreq interface; memset(&maddr,0,sizeof(maddr)); memset(&localif,0,sizeof(localif)); memset(&mreq4,0,sizeof(mreq4)); memset(&mreq6,0,sizeof(mreq6)); memset(&hints,0,sizeof(hints)); memset(&interface,0,sizeof(interface)); if ( -1 == check_error(sfd = create_inet_server_socket(group,port,LIBSOCKET_UDP,LIBSOCKET_BOTH,0)) ) { return -1; } hints.ai_socktype = SOCK_DGRAM; hints.ai_family = AF_UNSPEC; if ( 0 != (return_value = getaddrinfo(group,port,&hints,&result)) ) { int errno_saved = errno; # ifdef VERBOSE const char* errstring = gai_strerror(return_value); debug_write(errstring); # endif close(sfd); errno = errno_saved; return -1; } if ( result->ai_family == AF_INET ) { // Result is IPv4 address. mreq4.imr_multiaddr = ((struct sockaddr_in*)result->ai_addr)->sin_addr; if ( if_name == NULL ) { mreq4.imr_ifindex = 0; any.s_addr = INADDR_ANY; mreq4.imr_address = any; } else { memcpy(interface.ifr_name,if_name,strlen(if_name) > IFNAMSIZ ? IFNAMSIZ : strlen(if_name)); if ( -1 == check_error(ioctl(sfd,SIOCGIFINDEX,&interface)) ) { int errno_saved = errno; close(sfd); errno = errno_saved; return -1; } mreq4.imr_ifindex = interface.ifr_ifindex; } if ( -1 == check_error(setsockopt(sfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq4,sizeof(struct ip_mreqn))) ) { int errno_saved = errno; close(sfd); errno = errno_saved; return -1; } if ( -1 == check_error(setsockopt(sfd,IPPROTO_IP,IP_MULTICAST_IF,&mreq4,sizeof(struct ip_mreqn))) ) { int errno_saved = errno; close(sfd); errno = errno_saved; return -1; } // Setup finished. // } else if ( result->ai_family == AF_INET6 ) { mreq6.ipv6mr_multiaddr = ((struct sockaddr_in6*)result->ai_addr)->sin6_addr; mreq6.ipv6mr_interface = 0; if ( if_name == NULL ) mreq6.ipv6mr_interface = 0; else { memcpy(interface.ifr_name,if_name,strlen(if_name) > IFNAMSIZ ? IFNAMSIZ : strlen(if_name)); if ( -1 == check_error(ioctl(sfd,SIOCGIFINDEX,&interface)) ) { int errno_saved = errno; close(sfd); errno = errno_saved; return -1; } mreq6.ipv6mr_interface = interface.ifr_ifindex; } if ( -1 == check_error(setsockopt(sfd,IPPROTO_IPV6,IPV6_ADD_MEMBERSHIP,&mreq6,sizeof(struct ipv6_mreq))) ) { int errno_saved = errno; close(sfd); errno = errno_saved; return -1; } if ( -1 == check_error(setsockopt(sfd,IPPROTO_IPV6,IPV6_MULTICAST_IF,&mreq6.ipv6mr_interface,sizeof(mreq6.ipv6mr_interface))) ) { int errno_saved = errno; close(sfd); errno = errno_saved; return -1; } } return sfd; }