Example #1
0
//
// Constructor
//
InetSocketAddress::InetSocketAddress(const char* hostname, in_port_t port, bool ipv6)
throw(IllegalArgumentException)
{
    _ipv6 = ipv6;

    // Inicializa el puerto
    init_port(port);

    // Intenta resolver la direccion IP de "hostname"
    InetAddress* inaddr = NULL;
    try
    {
        inaddr = InetAddress::getByName(hostname);
    }
    catch(...)
    {
        _resolved = false;
        init_addr(NULL);
        return;
    }

    // Inicializa la direccion IP y libera el objeto InetAddress
    init_addr(inaddr);
    delete inaddr;
}
Example #2
0
int main(int argc, char **argv)
{
	addr_t addr;
	double timeout = 5.0;
	int sock;

	if (argc < 2) {
		printf("Usage: connect host:port [timeout_in_seconds]\n");
		return 1;
	}

	if (argc > 2) {
		timeout = atof(argv[2]);
		if (timeout <= 0) {
			timeout = 5.0;
			printf("Warning: using timeout %gs\n", timeout);
		}
	}

	printf("Resolving...\n");
	if (init_addr(&addr, argv[1]) != 0)
		perror_fatal("init_addr(%s)", argv[1]);

	sock = socket(addr.name.sa_family, SOCK_STREAM, 0);
	if (sock == -1)
		perror_fatal("socket");

	printf("Connecting...\n");
	if (nonblock_connect(sock, &addr.name, addr.namelen, timeout * 1000) == -1)
		perror_fatal("connect(%s)", addr.a_addr);
	else
		printf("Success!\n");
	return 0;
}
Example #3
0
void init (int argc,char *argv[])
{
    struct lac *lac;
    init_args (argc,argv);
    rand_source = 0;
    init_addr ();
    if (init_config ())
    {
        log (LOG_CRIT, "%s: Unable to load config file\n", __FUNCTION__);
        exit (1);
    }
    if (uname (&uts))
    {
        log (LOG_CRIT, "%s : Unable to determine host system\n",
             __FUNCTION__);
        exit (1);
    }
    init_tunnel_list (&tunnels);
    if (init_network ())
        exit (1);
    if (gconfig.daemon)
	daemonize ();
    signal (SIGTERM, &death_handler);
    signal (SIGINT, &death_handler);
    signal (SIGCHLD, &child_handler);
    signal (SIGUSR1, &status_handler);
    signal (SIGHUP, &null_handler);
    init_scheduler ();
    mkfifo (CONTROL_PIPE, 0600);
    control_fd = open (CONTROL_PIPE, O_RDONLY | O_NONBLOCK, 0600);
    if (control_fd < 0)
    {
        log (LOG_CRIT, "%s: Unable to open " CONTROL_PIPE " for reading.",
             __FUNCTION__);
        exit (1);
    }
    log (LOG_LOG, "l2tpd version " SERVER_VERSION " started on %s PID:%d\n",
         hostname, getpid ());
    log (LOG_LOG,
         "Written by Mark Spencer, Copyright (C) 1998, Adtran, Inc.\n");
    log (LOG_LOG, "Forked by Scott Balmos and David Stipp, (C) 2001\n");
    log (LOG_LOG, "Inhereted by Jeff McAdams, (C) 2002\n");
    log (LOG_LOG, "%s version %s on a %s, port %d\n", uts.sysname,
         uts.release, uts.machine, gconfig.port);
    lac = laclist;
    while (lac)
    {
        if (lac->autodial)
        {
#ifdef DEBUG_MAGIC
            log (LOG_DEBUG, "%s: Autodialing '%s'\n", __FUNCTION__,
                 lac->entname[0] ? lac->entname : "(unnamed)");
#endif
            lac->active = -1;
            switch_io = 1;      /* If we're a LAC, autodials will be ICRQ's */
            magic_lac_dial (lac);
        }
        lac = lac->next;
    }
}
Example #4
0
File: server.c Project: ARO17/prog
int main(int argc, char *argv[])
{
    int sock;
    struct sockaddr_in addr;
    struct sockaddr_in src_addr;
    socklen_t len_inet = 0;
    ssize_t read_bytes = 0;
    ssize_t wrote_bytes = 0;
    int data_size = 0;
    char buf[BUFSIZE];

    // create socket
    if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
	perror("socket");
	return -1;
    }

    // init server address
    if (init_addr(&addr, "127.0.0.1", 1234) < 0) {
	fprintf(stdout, "init_addr error\n");
	return -1;
    }

    // associate socket and address and port
    if (bind(sock, (struct sockaddr *) &addr,
	     sizeof(struct sockaddr_in)) < 0) {
	close(sock);
	perror("bind");
	return -1;
    }

    len_inet = sizeof(src_addr);

    printf("Listen on %s:%d\n", inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));
    
    // received data
    for (;;) {
	if ((read_bytes = recvfrom(sock, buf, BUFSIZE, 0, (struct sockaddr*) &src_addr, &len_inet)) < 0) {
	    perror("recvfrom");
	    return -1;
	} else {
	    printf("Received from: %s, %d\n", inet_ntoa(src_addr.sin_addr), ntohs(src_addr.sin_port));
	    printf("%d bytes received\nReceived data: %s\n", (int)read_bytes, buf);

	    strcpy(buf, "ack");
	    data_size = strlen(buf) + 1;
	    
	    // send data
	    if ((wrote_bytes = sendto(sock, buf, data_size, 0, (struct sockaddr*) &src_addr, sizeof(struct sockaddr_in))) < 0) {
		perror("sendto");
		return -1;
	    }
	}
    }

    return 0;
}
Example #5
0
//
// Constructor
//
InetSocketAddress::InetSocketAddress(in_port_t port, bool ipv6)
throw(IllegalArgumentException)
{
    _ipv6 = ipv6;

    // Inicializa el puerto
    init_port(port);

    // Inicializa la direccion IP
    init_addr(NULL);
}
Example #6
0
int sockaddr_to_ia (struct sockaddr * sap, int addr_size,
                    struct internet_addr * ia)
{
  struct sockaddr_in  * sin  = (struct sockaddr_in  *) sap;
  struct sockaddr_in6 * sin6 = (struct sockaddr_in6 *) sap;
  if ((sap->sa_family == AF_INET) &&
      (addr_size >= sizeof (struct sockaddr_in))) {
    init_addr (AF_INET, (unsigned char *) &(sin->sin_addr), sin->sin_port, ia);
    return 1;
  } else if ((sap->sa_family == AF_INET6) &&
             (addr_size >= sizeof (struct sockaddr_in6))) {
    init_addr (AF_INET6, (unsigned char *) &(sin6->sin6_addr),
               sin6->sin6_port, ia);
    return 1;
  } else {
    printf ("unable to create address info with family %d, size %d\n",
            sap->sa_family, addr_size);
    return 0;
  }
}
Example #7
0
int connect_block(const char *s, int defport) {
	struct sockaddr_in a;
	init_addr(a, s, defport);

	int sock = socket(AF_INET, SOCK_STREAM, 0);
	if (0 > sock)
		fatal("socket: %s\n", strerror(errno));

	if (0 > connect(sock, (struct sockaddr *)&a, sizeof(struct sockaddr)))
		fatal("connect: %s: %s\n", s, strerror(errno));

	return sock;
}
Example #8
0
/* Dispatch routine for set/change password */
void
dispatch(void *handle, struct sockaddr *local_saddr,
         const krb5_fulladdr *remote_faddr, krb5_data *request, int is_tcp,
         verto_ctx *vctx, loop_respond_fn respond, void *arg)
{
    krb5_error_code ret;
    krb5_keytab kt = NULL;
    kadm5_server_handle_t server_handle = (kadm5_server_handle_t)handle;
    krb5_fulladdr local_faddr;
    krb5_address **local_kaddrs = NULL, local_kaddr_buf;
    krb5_data *response = NULL;

    if (local_saddr == NULL) {
        ret = krb5_os_localaddr(server_handle->context, &local_kaddrs);
        if (ret != 0)
            goto egress;

        local_faddr.address = local_kaddrs[0];
        local_faddr.port = 0;
    } else {
        local_faddr.address = &local_kaddr_buf;
        init_addr(&local_faddr, local_saddr);
    }

    ret = krb5_kt_resolve(server_handle->context, "KDB:", &kt);
    if (ret != 0) {
        krb5_klog_syslog(LOG_ERR, _("chpw: Couldn't open admin keytab %s"),
                         krb5_get_error_message(server_handle->context, ret));
        goto egress;
    }

    response = k5alloc(sizeof(krb5_data), &ret);
    if (response == NULL)
        goto egress;

    ret = process_chpw_request(server_handle->context,
                               handle,
                               server_handle->params.realm,
                               kt,
                               &local_faddr,
                               remote_faddr,
                               request,
                               response);
egress:
    if (ret)
        krb5_free_data(server_handle->context, response);
    krb5_free_addresses(server_handle->context, local_kaddrs);
    krb5_kt_close(server_handle->context, kt);
    (*respond)(arg, ret, ret == 0 ? response : NULL);
}
Example #9
0
int connect_nonblock(const char *s, int defport) {
	struct sockaddr_in a;
	init_addr(a, s, defport);

	int sock = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0);
	if (0 > sock)
		fatal("socket: %s\n", strerror(errno));

	int e = connect(sock, (struct sockaddr *)&a, sizeof(struct sockaddr));
	if (0 == e || (0 > e && errno == EINPROGRESS))
		return sock;

	if (0 > e && errno != ECONNREFUSED)
		fatal("connect: %s: %s\n", s, strerror(errno));

	close(sock);
	return -1;
}
Example #10
0
int connect_to(const char *host, int port)
{
	addr_t a;
	char buf[64];
	int s;

	sprintf(buf, "%s:%d", host, port);
	if (init_addr(&a, buf) != 0)
		perror_fatal("connect %s:%u", host, port);

	free(a.a_addr);

	s = socket(a.name.sa_family, SOCK_STREAM, 0);
	if (s == -1)
		perror_fatal("socket");

	if (nonblock_connect(s, &a.name, a.namelen, 1000) != 0)
		perror_fatal("connect(%s:%d)", host, port);

	return s;
}
Example #11
0
/* returns 1 for success, 0 for failure */
int init_ai (int af, unsigned char * addr, int port, int nbits,
             unsigned char * dest, struct addr_info * ai)
{
  memset ((char *) ai, 0, sizeof (struct addr_info));
  ai->nbits = nbits;
  if (! (init_addr (af, addr, port, &(ai->ip))))
    return 0;

  memset (ai->destination, 0, ADDRESS_SIZE);
  int nbytes = (nbits + 7) / 8;
  if (nbytes > ADDRESS_SIZE) {
    printf ("warning: in init_ai, nbits %d, nbytes %d, limiting to %d\n",
            nbits, nbytes, ADDRESS_SIZE);
    nbytes = ADDRESS_SIZE;
    nbits = ADDRESS_SIZE * 8;
  }
  ai->nbits = nbits;
  if (nbits > 0)
    memcpy (ai->destination, dest, nbytes);
  return 1;
}
Example #12
0
int main( int argc, char ** argv )
{
	char * ip;
	if( argc == 1 ) {
		ip = "127.0.0.1";	
	} else if( argc == 2 ) {
		ip = argv[1];
	} else {
		fprintf( stderr, "Usage: %s ipaddress.\n", argv[0] );
		exit( 1 );
	}


	int sock_connect_fd = socket( AF_INET, SOCK_STREAM, 0 );
		
	struct sockaddr_in server_addr;
	init_addr( &server_addr, PORT_NUM, ip ); 	

	int ret = connect( sock_connect_fd, ( sockaddr_t * ) &server_addr, ADDR_SIZE ); 
	if( ret == -1 ) {
		perror("connect");
		exit( 1 );
	}
	
	char buf[1024];
	bzero( buf, 1024 );
	int packet_no = 0;
	while( 1 ) {
		packet_no ++;	
		buf[0] = 'A';
		send( sock_connect_fd, buf, 1, 0 );
		printf("Have sent %d packets.\n", packet_no );
		if( packet_no == 10000 )
			break;
	}
	
	close( sock_connect_fd );
		
	return 0;
}
Example #13
0
void read_send( const string & host, unsigned short port )
{
	sockaddr_in to_addr = init_addr( host, port );

	SOCKET s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

	while( true )
	{
		string read;
		cin >> read;
		if( read == "quit" )
		{
			break;
		}
		cout << "[SYS:send]" << read << endl;
		char send_buf[1024] = {0};
		unsigned short message_len = static_cast<unsigned short>( read.length() );
		::memcpy( send_buf, &message_len, sizeof(message_len) );
		::memcpy( send_buf + sizeof(message_len), read.c_str(), message_len );
		::sendto( s, send_buf, message_len + sizeof(message_len), 0, (SOCKADDR*)&to_addr, sizeof(to_addr) );

		sockaddr_in server_addr;
		int addr_size = sizeof(server_addr);
		char buf[1024] = {0};

		int size = ::recvfrom( s, buf, sizeof(buf), 0, (SOCKADDR*)&server_addr, &addr_size );
		if( size == -1 ) {
			cout << "[SYS]can not read response." << endl;
			continue ;
		}

		::memcpy( &message_len, buf, sizeof(message_len) );
		assert( size >= message_len + 2 );
		string received( buf + sizeof( message_len ), message_len );
		cout << received << endl;
	}
}
int main() {
    int fd = -1;
    struct sockaddr_in addr;
    socklen_t len = sizeof(addr);

    int cfd = -1;
    struct sockaddr_in caddr;
    socklen_t  clen = sizeof(caddr);

    init_addr(&addr, AF_INET, 8888, "127.0.0.1");

    if ( (fd = create_socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        printf("error: %s\n", strerror(errno));
        return -1;
    }

    set_nonblock(fd);
    set_reuseAddr(fd);

    if ( bind_socket(fd, (struct sockaddr*)&addr, len) < 0) {
        printf("error: %s\n", strerror(errno));
        return -1;
    }

    if (listen(fd, 10) != 0) {
        printf("error: %s\n", strerror(errno));
        return -1;
    }

    cfd = accept(fd, (struct sockaddr*)&caddr, &clen);
    if (cfd < 0) {
        printf("-- error: %s : %s\n", get_errnoStr(errno), strerror(errno));
    }

    return 0;
}
Example #15
0
void init (int argc,char *argv[])
{
    struct lac *lac;
    struct in_addr listenaddr;
    struct utsname uts;

    init_args (argc,argv);
    srand( time(NULL) );
    rand_source = 0;
    init_addr ();
    if (init_config ())
    {
        l2tp_log (LOG_CRIT, "%s: Unable to load config file\n", __FUNCTION__);
        exit (1);
    }
    if (uname (&uts)<0)
    {
        l2tp_log (LOG_CRIT, "%s : Unable to determine host system\n",
             __FUNCTION__);
        exit (1);
    }
    init_tunnel_list (&tunnels);
    if (init_network ())
        exit (1);

    if (gconfig.daemon)
        daemonize ();

    consider_pidfile();

    signal (SIGTERM, &sigterm_handler);
    signal (SIGINT, &sigint_handler);
    signal (SIGCHLD, &sigchld_handler);
    signal (SIGUSR1, &sigusr1_handler);
    signal (SIGHUP, &sighup_handler);
    init_scheduler ();

    unlink(gconfig.controlfile);
    mkfifo (gconfig.controlfile, 0600);

    open_controlfd();

    l2tp_log (LOG_INFO, "xl2tpd version " SERVER_VERSION " started on %s PID:%d\n",
         hostname, getpid ());
    l2tp_log (LOG_INFO,
         "Written by Mark Spencer, Copyright (C) 1998, Adtran, Inc.\n");
    l2tp_log (LOG_INFO, "Forked by Scott Balmos and David Stipp, (C) 2001\n");
    l2tp_log (LOG_INFO, "Inherited by Jeff McAdams, (C) 2002\n");
    l2tp_log (LOG_INFO, "Forked again by Xelerance (www.xelerance.com) (C) 2006\n");
    listenaddr.s_addr = gconfig.listenaddr;
    l2tp_log (LOG_INFO, "Listening on IP address %s, port %d\n",
              inet_ntoa(listenaddr), gconfig.port);
    lac = laclist;
    while (lac)
    {
        if (lac->autodial)
        {
#ifdef DEBUG_MAGIC
            l2tp_log (LOG_DEBUG, "%s: Autodialing '%s'\n", __FUNCTION__,
                 lac->entname[0] ? lac->entname : "(unnamed)");
#endif
            lac->active = -1;
            switch_io = 1;      /* If we're a LAC, autodials will be ICRQ's */
            magic_lac_dial (lac);
        }
        lac = lac->next;
    }
}
Example #16
0
void init (int argc,char *argv[])
{
    struct lac *lac;
    struct in_addr listenaddr;
    int myRet=0;

    init_args (argc,argv);
    srand( time(NULL) );
    rand_source = 0;
    init_addr ();
    if (init_config ())
    {
        log (LOG_CRIT, "%s: Unable to load config file\n", __FUNCTION__);
        exit (1);
    }
    init_tunnel_list (&tunnels);
    if (init_network ())
        exit (1);
    //if (gconfig.daemon)
	//daemonize ();
    signal (SIGTERM, &death_handler);
    signal (SIGINT, &death_handler);
    signal (SIGCHLD, &child_handler);
    signal (SIGUSR1, &status_handler);
    signal (SIGHUP, &null_handler);
    init_scheduler ();

    unlink (gconfig.controlfile);
    myRet=mkfifo (gconfig.controlfile, 0600);
//    log (LOG_LOG,"gconfig.controlfile=%s, myRet=%d,errno=%d",gconfig.controlfile,myRet,errno);//Added for test
    if(myRet<0)
    {
    	 log (LOG_CRIT, "%s: Unable to mkfifo %s.",__FUNCTION__, gconfig.controlfile);
        exit (1);
    }
    control_fd = open (gconfig.controlfile, O_RDONLY | O_NONBLOCK, 0600);
    if (control_fd < 0)
    {
        log (LOG_CRIT, "%s: Unable to open %s for reading.",
             __FUNCTION__, gconfig.controlfile);
        exit (1);
    }
    log (LOG_LOG, "l2tpd version " SERVER_VERSION " started on %s PID:%d\n",
         hostname, getpid ());
    log (LOG_LOG,
         "Written by Mark Spencer, Copyright (C) 1998, Adtran, Inc.\n");
    log (LOG_LOG, "Forked by Scott Balmos and David Stipp, (C) 2001\n");
    log (LOG_LOG, "Inherited by Jeff McAdams, (C) 2002\n");
    listenaddr.s_addr = gconfig.listenaddr;
    log (LOG_LOG, "Listening on IP address %s, port %d\n",
	 inet_ntoa(listenaddr), gconfig.port);
    lac = laclist;
    while (lac)
    {
        if (lac->autodial)
        {
#ifdef DEBUG_MAGIC
            log (LOG_DEBUG, "%s: Autodialing '%s'\n", __FUNCTION__,
                 lac->entname[0] ? lac->entname : "(unnamed)");
#endif
            lac->active = -1;
            switch_io = 1;      /* If we're a LAC, autodials will be ICRQ's */
            magic_lac_dial (lac);
        }
        lac = lac->next;
    }
}
Example #17
0
File: main.c Project: akalend/mymc
int main(int argc, char **argv){

	int mc_sock;
	addr_t mc_addr;	
	ev_io  mc_io;
	sophiadb_t * db;		
	int c;	
	
	
	while (1) {
		int option_index = 0;
		static struct option long_options[] = {
			{"help",		no_argument,		0, 'h'},
			{"version",		no_argument,		0, 'V'},
			{"max-clients",	required_argument,	0, 'l'},
			{0, 0, 0, 0}
		};
		c = getopt_long(argc, argv, "n:Vc:t", long_options, &option_index);
		if (c == -1)
			break;
		switch (c) {
			case 'c':
				confilename = optarg;
				break;
			case 'n':
				max_clients = atoi(optarg);
				break;
			case 'V':
				printf("Version %s\n",  MYMC_VERSION);
				exit(0);
			case 't':
				is_trace = 1;
				break;			default:
				usage(argv[0], c == 'h' ? EXIT_SUCCESS : EXIT_FAILURE);
		}
	}
	

	if (confilename) 
		parse(confilename, &server_ctx);
	else	
		parse( CONFIGFILE, &server_ctx);

	//assert(server_ctx.logfile);
	//assert(server_ctx.listen);
	
	if (!server_ctx.listen) {
		perror("undefined listen port");
		exit(1);
	}
	

	flog =  server_ctx.logfile ? fopen(server_ctx.logfile, "a+") : fopen("error.log", "a+");
	
	if (flog) {		
		time_t lt;
  		lt = time(NULL);
  		fprintf(flog, "server started at %s\n",ctime(&lt));	
	}	else {
			perror("can not create log file");
			exit(1);
		}

	daemonize(server_ctx.is_demonize, server_ctx.pidfile, server_ctx.username);

	set_rlimit();	
	ignore_sigpipe();
		
	init_addr(&mc_addr, server_ctx.listen);

	mc_sock = socket(mc_addr.pf_family, SOCK_STREAM, 0);
	if (mc_sock < 0) {
		perror("can't create socket");
		exit(1);
	}

	listen_sock(mc_sock, &mc_addr);
	
	//TODO	
	if (is_trace)
		printf("pid=%ld\n\n", (long)getpid());
	
	clients = calloc(max_clients, sizeof(fd_ctx));
	if (!clients) {
		perror_fatal("Cannot allocate array for client descriptors!");		
	}

	int i=0;
	while(i < max_clients) {
		if(clients[i].mc) 
			printf("init err %i\n", i);
		i++;
	}
		
	db = db_init(&server_ctx);
	assert(db);
	
	struct ev_loop *loop = ev_default_loop(0);	
	assert(loop);
	
	ev_set_userdata(loop,(void*)db);	
		
	ev_io_init(  &mc_io, memcached_on_connect, mc_sock, EV_READ);		
	ev_io_start(loop, &mc_io);

	struct ev_timer timeout_watcher;	

	ev_init(&timeout_watcher, periodic_watcher);
	timeout_watcher.repeat = TIME_CHECK_INTERVAL;
	ev_timer_again(loop, &timeout_watcher);

	struct ev_signal signal_watcher,signal_watcher2;
	
//	ev_signal_init (&signal_watcher, sigint_cb, SIGINT);
//	ev_signal_start (loop,  &signal_watcher);
	
	ev_signal_init (&signal_watcher, sigint_cb, SIGTERM);
	ev_signal_start (loop,  &signal_watcher);

	ev_signal_init (&signal_watcher2, sighup_cb, SIGHUP);
	ev_signal_start (loop,  &signal_watcher2);
	

	//start server
	time(&stats.uptime);
	gettimeofday(&t_start, NULL);

	// event loop
	ev_loop(loop, 0);
	
	cllear_mc_all();	
	close(mc_sock);	
	
	if (clients) 
		free(clients);
	
	//ev_loop_destroy(loop);
	
	destroy(db);
	
	if (mc_addr.a_addr) free(mc_addr.a_addr);
	
	if (server_ctx.pidfile) {		
		if( unlink(server_ctx.pidfile))
			printf("cannot delete pid file %s %s\n",server_ctx.pidfile, strerror(errno));
	}	

	free_config(); 
	if (flog) {		
		time_t lt;
  		lt = time(NULL);
  		
  		fprintf(flog, "server finis Ok at %s\n",ctime(&lt));
		fclose(flog);	
	}

	return 0;
	 
}
Example #18
0
/*
 * Class:     net_RawIPv6Socket
 * Method:    _send
 * Signature: (I[B[BI[BII)I
 */
JNIEXPORT jint JNICALL Java_net_RawIPv6Socket__1send
  (JNIEnv *env, jobject obj, jint socket, jbyteArray srcaddress, jbyteArray dstaddress, jint dstscopeid,
        jbyteArray data, jint offset, jint len, jint ttl, jint tos) {
    int result;
    jbyte *buf;
    struct sockaddr_in6 sin6;
    struct sockaddr *saddr;
    struct msghdr mhdr;
    struct iovec iovecs[1];
    char msg_control_buffer6[CMSG_SPACE(sizeof(int))+CMSG_SPACE(sizeof(int))+CMSG_SPACE(sizeof(struct in6_pktinfo))]; 
    struct cmsghdr *cmsg;
    int controllen;
    struct in6_pktinfo *pktinfo6;
    int *sent_ttl;
    int *sent_tos;
    
    saddr = fill_sockaddr_in6(env, &sin6, dstaddress, dstscopeid);
 

    buf = (*env)->GetByteArrayElements(env, data, NULL);

    mhdr.msg_name = saddr;
    mhdr.msg_namelen = sizeof(sin6);
    iovecs[0].iov_base= &buf[offset];
    iovecs[0].iov_len = len;
    mhdr.msg_iov = &iovecs[0];
    mhdr.msg_iovlen = 1;
    mhdr.msg_control = msg_control_buffer6;
    mhdr.msg_controllen = sizeof(msg_control_buffer6);
    controllen = 0;
    cmsg = CMSG_FIRSTHDR(&mhdr);
    cmsg->cmsg_level = IPPROTO_IPV6;
    cmsg->cmsg_type = IPV6_PKTINFO;
    cmsg->cmsg_len = 0;
    pktinfo6 = (struct in6_pktinfo*) CMSG_DATA(cmsg);
    pktinfo6->ipi6_ifindex = 0;
    pktinfo6->ipi6_addr = in6addr_any;//source address not specified 
    if (srcaddress != NULL)
        init_addr(env,&pktinfo6->ipi6_addr,srcaddress,sizeof(struct in6_addr));
    controllen += CMSG_SPACE(sizeof(struct in6_pktinfo));  
    cmsg = (struct cmsghdr *)((unsigned char*)cmsg + CMSG_SPACE(sizeof(struct in6_pktinfo)));
    
    if (ttl >=0) {
        
        cmsg->cmsg_level = IPPROTO_IPV6;
        cmsg->cmsg_type = IPV6_HOPLIMIT;
        cmsg->cmsg_len = CMSG_LEN(sizeof(int));
        sent_ttl = (int *)CMSG_DATA(cmsg);
        *sent_ttl = ttl;
        controllen += CMSG_SPACE(sizeof(int));
        cmsg = (struct cmsghdr *)((unsigned char*)cmsg + CMSG_SPACE(sizeof(int)));
    }
    if (tos >=0) {
        cmsg = CMSG_NXTHDR(&mhdr,cmsg);
        cmsg->cmsg_level = IPPROTO_IPV6;
        cmsg->cmsg_type = IPV6_TCLASS;
        cmsg->cmsg_len = CMSG_LEN(sizeof(int));
        sent_tos = (int *)CMSG_DATA(cmsg);
        *sent_tos = tos;
        controllen += CMSG_SPACE(sizeof(int));
        cmsg = (struct cmsghdr *)((unsigned char*)cmsg + CMSG_SPACE(sizeof(int)));
    }
    mhdr.msg_controllen = controllen;
    
    result = sendmsg(socket,&mhdr,0);

    (*env)->ReleaseByteArrayElements(env, data, buf, JNI_ABORT);

    return result;
}