示例#1
0
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, &copy 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;
}
示例#4
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;
}