PDA

View Full Version : Stringa java in programma C


ambuotiz
19-09-2005, 17:05
Ho un programma scritto in C che utilizza una interfaccia Java. il programma
scritto in C prende tra i vari parametri anche una stringa.
il metodo libnet_name2addr6 prende come secondo parametro una stringa
(so_ip).
s_ip č la stringa java che viene passata al metodo C.
Se scrivo cosė mi da errore. perchč?

char buf_s_ip[128];
const char *so_ip = (*env)->GetStringUTFChars(env, s_ip, 0);

struct libnet_in6_addr dest_ip = libnet_name2addr6(l, so_ip,
LIBNET_DONT_RESOLVE);

franksisca
19-09-2005, 18:34
prova a postare + codice e in maniera pių leggibile, ook ;)

ambuotiz
19-09-2005, 19:35
#include <String.h>
#include <stdio.h>
#include <libnet.h>
#include "Ipktgenipv6.h"


JNIEXPORT jint JNICALL Java_Ipktgenipv6_Pktgenipv6
(JNIEnv *env, jobject obj, jchar tc, jlong fl, jchar nh, jchar hl, jstring s_ip, jstring d_ip, jbyteArray payload)
{
struct input_struct
{
u_char tc;
u_long fl;
u_char nh; /* next header */
u_char hl; /* hop limit */
u_char *data; /* ip payload */
u_short data_size; /* ip payload size */
}
input;

u_short h_lenght; /* header lenght */
char err_buf[LIBNET_ERRBUF_SIZE]; /* error buffer */

libnet_t *l; /* libnet context handler */

char buf_s_ip[128];
const char *so_ip = (*env)->GetStringUTFChars(env, s_ip, 0);
strcopy(buf_s_ip,so_ip);
(*env)->ReleaseStringUTFChars(env, s_ip, so_ip);

char buf_d_ip[128];
const char *de_ip = (*env)->GetStringUTFChars(env, s_ip, 0);
(*env)->ReleaseStringUTFChars(env, d_ip, de_ip);
/* set default */
jsize len = (*env)->GetArrayLength(env, payload);
jbyte *body = (*env)->GetByteArrayElements(env, payload, 0);
char cpayload [len];
int i;
for (i=0; i<len; i++)
{
cpayload[i] = body[i];
}

input.data_size=len;
input.data=(u_char*)cpayload;

/* initialize libnet_t* */
if ((l=libnet_init(LIBNET_RAW6, /* injection type */
NULL, /* network interface */
err_buf))==NULL) /* error buffer */
{
//fprintf (stderr, "Error: %s\n", err_buf);
return -1;
}
struct libnet_in6_addr source_ip = libnet_name2addr6(l, (*env)-> NewStringUTF(env, strupr(buf_s_ip)), LIBNET_DONT_RESOLVE);
struct libnet_in6_addr dest_ip = libnet_name2addr6(l, de_ip, LIBNET_DONT_RESOLVE);

/* build ipv4 header */
if (libnet_build_ipv6
(
tc, /* traffic class */
fl, /* flow label */
h_lenght+input.data_size, /* len */
nh, /* tos */
hl, /* id */
source_ip, /* source address */
dest_ip, /* destination address */
NULL, /* ip payload */
0, /* ip payload size */
l, /* libnet context */
0 /* we don't need ptag */
)==-1)
{

//fprintf (stderr, "Error %s\n", libnet_geterror(l));
return -1;
}

//printf ("* IP header builded\n");

/* write packet */
libnet_write(l);
// fprintf (stderr, "Error %s\n", libnet_geterror(l));

// printf ("* Packet correctly wrote on wire: %d bytes\n", n);


/* destroy all */
libnet_destroy(l);





return 1;
}