From: <oi...@us...> - 2008-03-27 13:26:55
|
Revision: 2619 http://unicore.svn.sourceforge.net/unicore/?rev=2619&view=rev Author: oistrez Date: 2008-03-27 06:26:52 -0700 (Thu, 27 Mar 2008) Log Message: ----------- Modified Paths: -------------- unicorex/uas-udt/trunk/src/main/cplusplus/udt4/src/fufex.cpp unicorex/uas-udt/trunk/src/main/cplusplus/udt4/src/fufex.h Modified: unicorex/uas-udt/trunk/src/main/cplusplus/udt4/src/fufex.cpp =================================================================== --- unicorex/uas-udt/trunk/src/main/cplusplus/udt4/src/fufex.cpp 2008-03-27 10:29:33 UTC (rev 2618) +++ unicorex/uas-udt/trunk/src/main/cplusplus/udt4/src/fufex.cpp 2008-03-27 13:26:52 UTC (rev 2619) @@ -12,7 +12,7 @@ #include <iostream> //UDT-socket-API -#include <udt/udt.h> +#include "udt.h" using namespace std; @@ -22,9 +22,6 @@ #include <netdb.h> #include <arpa/inet.h> -//JNI-API -#include <jni.h> - #include "fufex.h" JNIEXPORT void JNICALL Java_de_fzj_unicore_uas_client_UDTClient_prepareClient(JNIEnv *env, jobject obj){ @@ -49,7 +46,7 @@ uname(&myname); ptr = gethostbyname(myname.nodename); - udpaddr.sin_addr.s_addr = *((int*)(ptr->h_addr_list[1])); //my IP + udpaddr.sin_addr.s_addr = *((int*)(ptr->h_addr_list[0])); //my IP udpaddr.sin_port = 0; //any port is ok udpaddr.sin_family = AF_INET; @@ -70,10 +67,10 @@ //IP jfieldID f = env->GetFieldID(c,"clientHost","[B"); jbyte a[4]; - a[0] = *(ptr->h_addr_list[1]); - a[1] = *(ptr->h_addr_list[1] +1); - a[2] = *(ptr->h_addr_list[1] +2); - a[3] = *(ptr->h_addr_list[1] +3); + a[0] = *(ptr->h_addr_list[0]); + a[1] = *(ptr->h_addr_list[0] +1); + a[2] = *(ptr->h_addr_list[0] +2); + a[3] = *(ptr->h_addr_list[0] +3); jbyteArray b = env->NewByteArray(4); env->SetByteArrayRegion(b,0,4,a); env->SetObjectField(obj,f,b); @@ -160,7 +157,7 @@ return JNI_FALSE; //prepare server socket informationen - srvaddr.sin_addr.s_addr = *((int*)(ptr->h_addr_list[1])); + srvaddr.sin_addr.s_addr = *((int*)(ptr->h_addr_list[0])); srvaddr.sin_port = 0; //any port is ok srvaddr.sin_family = AF_INET; @@ -202,10 +199,10 @@ //IP jfieldID f = env->GetFieldID(c,"serverHost","[B"); jbyte a[4]; - a[0] = *(ptr->h_addr_list[1]); - a[1] = *(ptr->h_addr_list[1] +1); - a[2] = *(ptr->h_addr_list[1] +2); - a[3] = *(ptr->h_addr_list[1] +3); + a[0] = *(ptr->h_addr_list[0]); + a[1] = *(ptr->h_addr_list[0] +1); + a[2] = *(ptr->h_addr_list[0] +2); + a[3] = *(ptr->h_addr_list[0] +3); jbyteArray b = env->NewByteArray(4); env->SetByteArrayRegion(b,0,4,a); env->SetObjectField(obj,f,b); Modified: unicorex/uas-udt/trunk/src/main/cplusplus/udt4/src/fufex.h =================================================================== --- unicorex/uas-udt/trunk/src/main/cplusplus/udt4/src/fufex.h 2008-03-27 10:29:33 UTC (rev 2618) +++ unicorex/uas-udt/trunk/src/main/cplusplus/udt4/src/fufex.h 2008-03-27 13:26:52 UTC (rev 2619) @@ -1,3 +1,6 @@ +//JNI-API +#include <jni.h> + //prototypes for the nativen functions //These functions are declared but not implemented in the JAVA classes //DO NOT EDIT THIS PART This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <oi...@us...> - 2008-04-28 08:56:56
|
Revision: 2835 http://unicore.svn.sourceforge.net/unicore/?rev=2835&view=rev Author: oistrez Date: 2008-04-28 01:56:55 -0700 (Mon, 28 Apr 2008) Log Message: ----------- Modified Paths: -------------- unicorex/uas-udt/trunk/src/main/cplusplus/udt4/src/fufex.cpp unicorex/uas-udt/trunk/src/main/cplusplus/udt4/src/fufex.h Modified: unicorex/uas-udt/trunk/src/main/cplusplus/udt4/src/fufex.cpp =================================================================== --- unicorex/uas-udt/trunk/src/main/cplusplus/udt4/src/fufex.cpp 2008-04-28 08:56:24 UTC (rev 2834) +++ unicorex/uas-udt/trunk/src/main/cplusplus/udt4/src/fufex.cpp 2008-04-28 08:56:55 UTC (rev 2835) @@ -5,7 +5,7 @@ // library (fufex) is part of the UDT File Transfer // implementation for the UNICORE software. // -// (C) 2007/2008: Thomas Oistrez +// Author: Thomas Oistrez //************************************************** //only for debugging @@ -23,222 +23,229 @@ #include <arpa/inet.h> #include "fufex.h" - - JNIEXPORT void JNICALL Java_de_fzj_unicore_uas_client_UDTClient_prepareClient(JNIEnv *env, jobject obj){ - UDTSOCKET u; - - int udp_port; - + +JNIEXPORT void JNICALL Java_de_fzj_unicore_uas_client_UDTClient_prepareClient(JNIEnv *env, jobject obj){ + UDTSOCKET u; + + int udp_port; + //my UDP information - struct sockaddr_in udpaddr; - int len = sizeof(udpaddr); - + struct sockaddr_in udpaddr; + int len = sizeof(udpaddr); + //my host information - struct utsname myname; - struct hostent *ptr; - + struct utsname myname; + struct hostent *ptr; + //prepare UDP port - u = UDT::socket(AF_INET,SOCK_STREAM,0); - if(u == -1) - return; - + u = UDT::socket(AF_INET,SOCK_STREAM,0); + if(u == -1) + return; + //get my host informationen - uname(&myname); - ptr = gethostbyname(myname.nodename); - - udpaddr.sin_addr.s_addr = *((int*)(ptr->h_addr_list[0])); //my IP - udpaddr.sin_port = 0; //any port is ok - udpaddr.sin_family = AF_INET; - - //bind socket to a port - if(UDT::bind(u,(struct sockaddr *)&udpaddr,len) == -1) - return; - + uname(&myname); + ptr = gethostbyname(myname.nodename); + + udpaddr.sin_addr.s_addr = *((int*)(ptr->h_addr_list[0])); //my IP + udpaddr.sin_port = 0; //any port is ok + udpaddr.sin_family = AF_INET; + + //bind socket to a port + if(UDT::bind(u,(struct sockaddr *)&udpaddr,len) == -1) + return; + //get information about the socket - if(UDT::getsockname(u, (struct sockaddr *)&udpaddr ,&len) == -1) - return; + if(UDT::getsockname(u, (struct sockaddr *)&udpaddr ,&len) == -1) + return; //read information about the UDP port - udp_port = udpaddr.sin_port; - - //save all results to JAVA class members (my IP, my port, UDT socket) - jclass c = env->GetObjectClass(obj); - - //IP - jfieldID f = env->GetFieldID(c,"clientHost","[B"); - jbyte a[4]; - a[0] = *(ptr->h_addr_list[0]); - a[1] = *(ptr->h_addr_list[0] +1); - a[2] = *(ptr->h_addr_list[0] +2); - a[3] = *(ptr->h_addr_list[0] +3); - jbyteArray b = env->NewByteArray(4); - env->SetByteArrayRegion(b,0,4,a); - env->SetObjectField(obj,f,b); - //port - jfieldID f2 = env->GetFieldID(c,"clientPort","I"); - env->SetIntField(obj,f2,(jint)udp_port); - //socket - jfieldID f3 = env->GetFieldID(c,"udtsocket","I"); + udp_port = udpaddr.sin_port; + + //save all results to JAVA class members (my IP, my port, UDT socket) + jclass c = env->GetObjectClass(obj); + + //IP + jfieldID f = env->GetFieldID(c,"clientHost","[B"); + jbyte a[4]; + a[0] = *(ptr->h_addr_list[0]); + a[1] = *(ptr->h_addr_list[0] +1); + a[2] = *(ptr->h_addr_list[0] +2); + a[3] = *(ptr->h_addr_list[0] +3); + jbyteArray b = env->NewByteArray(4); + env->SetByteArrayRegion(b,0,4,a); + env->SetObjectField(obj,f,b); +//port + jfieldID f2 = env->GetFieldID(c,"clientPort","I"); + env->SetIntField(obj,f2,(jint)udp_port); +//socket + jfieldID f3 = env->GetFieldID(c,"udtsocket","I"); env->SetIntField(obj,f3,(jint)u); - } +} - JNIEXPORT jboolean JNICALL Java_de_fzj_unicore_uas_client_UDTClient_runClient(JNIEnv *env, jobject p1, jbyteArray p2, jint p3, jint p4){ +JNIEXPORT jboolean JNICALL Java_de_fzj_unicore_uas_client_UDTClient_runClient(JNIEnv *env, jobject p1, jbyteArray p2, jint p3, jint p4, jstring p5, jboolean p6){ + //the prepared socket + UDTSOCKET u = p4; - //the prepared socket - UDTSOCKET u = p4; - //port and IP of the servers - int port = p3; - int server_ip = -1; + int port = p3; + int server_ip = -1; + + //transfer direction and file path + bool mode = p6; + const char* path; //socket informationen of the servers - struct sockaddr_in srvaddr; - int len = sizeof(srvaddr); + struct sockaddr_in srvaddr; + int len = sizeof(srvaddr); //get saved client IP (its saved in network byte order) - jbyte* buf = env->GetByteArrayElements(p2,NULL); - char buffer[4]; - for(int il=0;il<4;++il) - buffer[il] = buf[il]; - memcpy(&server_ip,buffer,4); + jbyte* buf = env->GetByteArrayElements(p2,NULL); + char buffer[4]; + for(int il=0;il<4;++il) + buffer[il] = buf[il]; + memcpy(&server_ip,buffer,4); + + //get path to file + path = env->GetStringUTFChars(p5, NULL); + std::cout << "Pfad: " << path << std::endl; //prepare servers socket informationen - srvaddr.sin_addr.s_addr = server_ip; //IP - srvaddr.sin_port = port; //port - srvaddr.sin_family = AF_INET; + srvaddr.sin_addr.s_addr = server_ip; //IP + srvaddr.sin_port = port; //port + srvaddr.sin_family = AF_INET; - if((UDT::connect(u,(struct sockaddr*)&srvaddr,len)) == UDT::ERROR) - return JNI_FALSE; - - //TODO: change this code to file transfer code - char testdaten[10] = "012345678"; - UDT::send(u,testdaten,10,0); - - close(u); - return JNI_TRUE; - } + if((UDT::connect(u,(struct sockaddr*)&srvaddr,len)) == UDT::ERROR) + return JNI_FALSE; - JNIEXPORT jboolean JNICALL Java_de_fzj_unicore_uas_fts_udt_UDTSession_prepareSrv(JNIEnv *env, jobject obj, jint p, jbyteArray i){ + //TODO: change this code to file transfer code + char size[10] = "012345678"; + UDT::send(u,size,10,0); - //temporary UDP socket for the Hole-Punching - int temp_udp_s = -1; + close(u); + return JNI_TRUE; +} - //socket informationen of the servers - struct sockaddr_in srvaddr; - socklen_t len = sizeof(srvaddr); +JNIEXPORT jboolean JNICALL Java_de_fzj_unicore_uas_fts_udt_UDTSession_prepareSrv(JNIEnv *env, jobject obj, jint p, jbyteArray i){ - //socket information of the client - struct sockaddr_in cliaddr; +//temporary UDP socket for the Hole-Punching + int temp_udp_s = -1; - //my host informationen - struct utsname myname; - struct hostent *ptr; - int udp_port; - - //save client connection information - int client_ip = -1; //this is set three lines below - int client_port = p; +//socket informationen of the servers + struct sockaddr_in srvaddr; + socklen_t len = sizeof(srvaddr); - //read IP and save it - jbyte *buf = env->GetByteArrayElements(i,NULL); - char buffer[4]; - for(int il=0;il<4;++il) - buffer[il] = buf[il]; - memcpy(&client_ip,buffer,4); - - temp_udp_s = socket(AF_INET,SOCK_DGRAM,0); - if(temp_udp_s == -1) - return JNI_FALSE; - - if(uname(&myname) < 0) - return JNI_FALSE; - - if( (ptr = gethostbyname(myname.nodename)) == NULL) - return JNI_FALSE; - - //prepare server socket informationen - srvaddr.sin_addr.s_addr = *((int*)(ptr->h_addr_list[0])); - srvaddr.sin_port = 0; //any port is ok - srvaddr.sin_family = AF_INET; +//socket information of the client + struct sockaddr_in cliaddr; - - //bind socket to a port - if(bind(temp_udp_s,(struct sockaddr *)&srvaddr,len) == -1) - return JNI_FALSE; - - //get information about the socket - getsockname(temp_udp_s,(struct sockaddr*)&srvaddr,&len); - udp_port = srvaddr.sin_port; - - //prepare socket informationen for the client - cliaddr.sin_addr.s_addr = client_ip; - cliaddr.sin_port = client_port; - cliaddr.sin_family = AF_INET; - - //send the Hole-Punching packet - char dummy = 0; - sendto(temp_udp_s,&dummy,1,0,(const struct sockaddr*)&cliaddr,sizeof(cliaddr)); - - //close the temporary UDP socket - close(temp_udp_s); +//my host informationen + struct utsname myname; + struct hostent *ptr; + int udp_port; - //create UDT server socket - UDTSOCKET u = UDT::socket(AF_INET,SOCK_STREAM,0); - if(u==UDT::INVALID_SOCK) - return JNI_FALSE; - - //bind to the same port we used for the Hole-Punching - UDT::bind(u,(struct sockaddr*)&srvaddr,sizeof(srvaddr)); - - //start listening to incoming connection - UDT::listen(u,1); +//save client connection information + int client_ip = -1; //this is set three lines below + int client_port = p; - //save all results to JAVA class members (my IP, my port, UDT socket) - jclass c = env->GetObjectClass(obj); - - //IP - jfieldID f = env->GetFieldID(c,"serverHost","[B"); - jbyte a[4]; - a[0] = *(ptr->h_addr_list[0]); - a[1] = *(ptr->h_addr_list[0] +1); - a[2] = *(ptr->h_addr_list[0] +2); - a[3] = *(ptr->h_addr_list[0] +3); - jbyteArray b = env->NewByteArray(4); - env->SetByteArrayRegion(b,0,4,a); - env->SetObjectField(obj,f,b); - //Port - jfieldID f2 = env->GetFieldID(c,"serverPort","I"); - env->SetIntField(obj,f2,(jint)udp_port); - //Socket - jfieldID f3 = env->GetFieldID(c,"udtsocket","I"); - env->SetIntField(obj,f3,(jint)u); - - return JNI_TRUE; - } +//read IP and save it + jbyte *buf = env->GetByteArrayElements(i,NULL); + char buffer[4]; + for(int il=0;il<4;++il) + buffer[il] = buf[il]; + memcpy(&client_ip,buffer,4); - JNIEXPORT jboolean JNICALL Java_de_fzj_unicore_uas_fts_udt_UDTSession_runSrv(JNIEnv *env, jobject p1, jint p2){ - - //the UDT server socket - UDTSOCKET u = p2; + temp_udp_s = socket(AF_INET,SOCK_DGRAM,0); + if(temp_udp_s == -1) + return JNI_FALSE; - //the socket for the incoming connection - UDTSOCKET s; - - //socket informationen of the incoming connection - struct sockaddr_in conaddr; - int len = sizeof(conaddr); - - if((s = UDT::accept(u,(struct sockaddr*)&conaddr,&len)) == UDT::ERROR) - return JNI_FALSE; + if(uname(&myname) < 0) + return JNI_FALSE; - //TODO: change this code to file transfer code - char testdaten[10] = "abcdefghi"; - UDT::recv(s,testdaten,10,0); - cout << "Erhalten:: " << testdaten << endl; - - UDT::close(s); - UDT::close(u); - - return JNI_TRUE; - } + if( (ptr = gethostbyname(myname.nodename)) == NULL) + return JNI_FALSE; +//prepare server socket informationen + srvaddr.sin_addr.s_addr = *((int*)(ptr->h_addr_list[0])); + srvaddr.sin_port = 0; //any port is ok + srvaddr.sin_family = AF_INET; + + +//bind socket to a port + if(bind(temp_udp_s,(struct sockaddr *)&srvaddr,len) == -1) + return JNI_FALSE; + +//get information about the socket + getsockname(temp_udp_s,(struct sockaddr*)&srvaddr,&len); + udp_port = srvaddr.sin_port; + +//prepare socket informationen for the client + cliaddr.sin_addr.s_addr = client_ip; + cliaddr.sin_port = client_port; + cliaddr.sin_family = AF_INET; + +//send the Hole-Punching packet + char dummy = 0; + sendto(temp_udp_s,&dummy,1,0,(const struct sockaddr*)&cliaddr,sizeof(cliaddr)); + +//close the temporary UDP socket + close(temp_udp_s); + +//create UDT server socket + UDTSOCKET u = UDT::socket(AF_INET,SOCK_STREAM,0); + if(u==UDT::INVALID_SOCK) + return JNI_FALSE; + +//bind to the same port we used for the Hole-Punching + UDT::bind(u,(struct sockaddr*)&srvaddr,sizeof(srvaddr)); + +//start listening to incoming connection + UDT::listen(u,1); + +//save all results to JAVA class members (my IP, my port, UDT socket) + jclass c = env->GetObjectClass(obj); + +//IP + jfieldID f = env->GetFieldID(c,"serverHost","[B"); + jbyte a[4]; + a[0] = *(ptr->h_addr_list[0]); + a[1] = *(ptr->h_addr_list[0] +1); + a[2] = *(ptr->h_addr_list[0] +2); + a[3] = *(ptr->h_addr_list[0] +3); + jbyteArray b = env->NewByteArray(4); + env->SetByteArrayRegion(b,0,4,a); + env->SetObjectField(obj,f,b); +//Port + jfieldID f2 = env->GetFieldID(c,"serverPort","I"); + env->SetIntField(obj,f2,(jint)udp_port); +//Socket + jfieldID f3 = env->GetFieldID(c,"udtsocket","I"); + env->SetIntField(obj,f3,(jint)u); + + return JNI_TRUE; + } + + JNIEXPORT jboolean JNICALL Java_de_fzj_unicore_uas_fts_udt_UDTSession_runSrv(JNIEnv *env, jobject p1, jint p2){ + +//the UDT server socket + UDTSOCKET u = p2; + +//the socket for the incoming connection + UDTSOCKET s; + +//socket informationen of the incoming connection + struct sockaddr_in conaddr; + int len = sizeof(conaddr); + + if((s = UDT::accept(u,(struct sockaddr*)&conaddr,&len)) == UDT::ERROR) + return JNI_FALSE; + +//TODO: change this code to file transfer code + char size[10] = "abcdefghi"; + UDT::recv(s,size,10,0); + cout << "Dateigroesse: " << size << endl; + + UDT::close(s); + UDT::close(u); + + return JNI_TRUE; + } + Modified: unicorex/uas-udt/trunk/src/main/cplusplus/udt4/src/fufex.h =================================================================== --- unicorex/uas-udt/trunk/src/main/cplusplus/udt4/src/fufex.h 2008-04-28 08:56:24 UTC (rev 2834) +++ unicorex/uas-udt/trunk/src/main/cplusplus/udt4/src/fufex.h 2008-04-28 08:56:55 UTC (rev 2835) @@ -22,19 +22,19 @@ JNIEXPORT jboolean JNICALL Java_de_fzj_unicore_uas_fts_udt_UDTSession_runSrv(JNIEnv *, jobject,jint); /* - * Class: de_fzj_unicore_uas_client_UDTClient - * Method: prepareClient - * Signature: ()V + * Class: de_fzj_unicore_uas_client_UDTClient + * Method: prepareClient + * Signature: ()V */ - JNIEXPORT void JNICALL Java_de_fzj_unicore_uas_client_UDTClient_prepareClient(JNIEnv *, jobject); +JNIEXPORT void JNICALL Java_de_fzj_unicore_uas_client_UDTClient_prepareClient(JNIEnv *, jobject); /* - * Class: de_fzj_unicore_uas_client_UDTClient - * Method: runClient - * Signature: ([BII)V + * Class: de_fzj_unicore_uas_client_UDTClient + * Method: runClient + * Signature: ([BIILjava/lang/String;Z)Z */ - JNIEXPORT jboolean JNICALL Java_de_fzj_unicore_uas_client_UDTClient_runClient(JNIEnv *, jobject, jbyteArray, jint, jint); +JNIEXPORT jboolean JNICALL Java_de_fzj_unicore_uas_client_UDTClient_runClient(JNIEnv *, jobject, jbyteArray, jint, jint, jstring, jboolean); #ifdef __cplusplus - } +} #endif //end: prototypes for the nativen functions This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <oi...@us...> - 2008-04-28 10:47:50
|
Revision: 2839 http://unicore.svn.sourceforge.net/unicore/?rev=2839&view=rev Author: oistrez Date: 2008-04-28 03:47:45 -0700 (Mon, 28 Apr 2008) Log Message: ----------- Modified Paths: -------------- unicorex/uas-udt/trunk/src/main/cplusplus/udt4/src/fufex.cpp unicorex/uas-udt/trunk/src/main/cplusplus/udt4/src/fufex.h Modified: unicorex/uas-udt/trunk/src/main/cplusplus/udt4/src/fufex.cpp =================================================================== --- unicorex/uas-udt/trunk/src/main/cplusplus/udt4/src/fufex.cpp 2008-04-28 10:42:13 UTC (rev 2838) +++ unicorex/uas-udt/trunk/src/main/cplusplus/udt4/src/fufex.cpp 2008-04-28 10:47:45 UTC (rev 2839) @@ -65,26 +65,26 @@ jclass c = env->GetObjectClass(obj); //IP - jfieldID f = env->GetFieldID(c,"clientHost","[B"); - jbyte a[4]; - a[0] = *(ptr->h_addr_list[0]); - a[1] = *(ptr->h_addr_list[0] +1); - a[2] = *(ptr->h_addr_list[0] +2); - a[3] = *(ptr->h_addr_list[0] +3); - jbyteArray b = env->NewByteArray(4); - env->SetByteArrayRegion(b,0,4,a); - env->SetObjectField(obj,f,b); -//port - jfieldID f2 = env->GetFieldID(c,"clientPort","I"); - env->SetIntField(obj,f2,(jint)udp_port); -//socket - jfieldID f3 = env->GetFieldID(c,"udtsocket","I"); - env->SetIntField(obj,f3,(jint)u); + jfieldID f = env->GetFieldID(c,"clientHost","[B"); + jbyte a[4]; + a[0] = *(ptr->h_addr_list[0]); + a[1] = *(ptr->h_addr_list[0] +1); + a[2] = *(ptr->h_addr_list[0] +2); + a[3] = *(ptr->h_addr_list[0] +3); + jbyteArray b = env->NewByteArray(4); + env->SetByteArrayRegion(b,0,4,a); + env->SetObjectField(obj,f,b); + //port + jfieldID f2 = env->GetFieldID(c,"clientPort","I"); + env->SetIntField(obj,f2,(jint)udp_port); + //socket + jfieldID f3 = env->GetFieldID(c,"udtsocket","I"); + env->SetIntField(obj,f3,(jint)u); } JNIEXPORT jboolean JNICALL Java_de_fzj_unicore_uas_client_UDTClient_runClient(JNIEnv *env, jobject p1, jbyteArray p2, jint p3, jint p4, jstring p5, jboolean p6){ //the prepared socket - UDTSOCKET u = p4; + UDTSOCKET u = p4; //port and IP of the servers int port = p3; @@ -107,7 +107,7 @@ //get path to file path = env->GetStringUTFChars(p5, NULL); - std::cout << "Pfad: " << path << std::endl; + std::cout << "Cli:Path: " << path << std::endl; //prepare servers socket informationen srvaddr.sin_addr.s_addr = server_ip; //IP @@ -125,127 +125,136 @@ return JNI_TRUE; } + JNIEXPORT jboolean JNICALL Java_de_fzj_unicore_uas_fts_udt_UDTSession_prepareSrv(JNIEnv *env, jobject obj, jint p, jbyteArray i){ + + //temporary UDP socket for the Hole-Punching + int temp_udp_s = -1; + + //socket informationen of the servers + struct sockaddr_in srvaddr; + socklen_t len = sizeof(srvaddr); + + //socket information of the client + struct sockaddr_in cliaddr; + + //my host informationen + struct utsname myname; + struct hostent *ptr; + int udp_port; + + //save client connection information + int client_ip = -1; //this is set three lines below + int client_port = p; + + //read IP and save it + jbyte *buf = env->GetByteArrayElements(i,NULL); + char buffer[4]; + for(int il=0;il<4;++il) + buffer[il] = buf[il]; + memcpy(&client_ip,buffer,4); + + temp_udp_s = socket(AF_INET,SOCK_DGRAM,0); + if(temp_udp_s == -1) + return JNI_FALSE; + + if(uname(&myname) < 0) + return JNI_FALSE; + + if( (ptr = gethostbyname(myname.nodename)) == NULL) + return JNI_FALSE; + + //prepare server socket informationen + srvaddr.sin_addr.s_addr = *((int*)(ptr->h_addr_list[0])); + srvaddr.sin_port = 0; //any port is ok + srvaddr.sin_family = AF_INET; + + + //bind socket to a port + if(bind(temp_udp_s,(struct sockaddr *)&srvaddr,len) == -1) + return JNI_FALSE; + + //get information about the socket + getsockname(temp_udp_s,(struct sockaddr*)&srvaddr,&len); + udp_port = srvaddr.sin_port; + + //prepare socket informationen for the client + cliaddr.sin_addr.s_addr = client_ip; + cliaddr.sin_port = client_port; + cliaddr.sin_family = AF_INET; + + //send the Hole-Punching packet + char dummy = 0; + sendto(temp_udp_s,&dummy,1,0,(const struct sockaddr*)&cliaddr,sizeof(cliaddr)); + + //close the temporary UDP socket + close(temp_udp_s); + + //create UDT server socket + UDTSOCKET u = UDT::socket(AF_INET,SOCK_STREAM,0); + if(u==UDT::INVALID_SOCK) + return JNI_FALSE; + + //bind to the same port we used for the Hole-Punching + UDT::bind(u,(struct sockaddr*)&srvaddr,sizeof(srvaddr)); + + //start listening to incoming connection + UDT::listen(u,1); + + //save all results to JAVA class members (my IP, my port, UDT socket) + jclass c = env->GetObjectClass(obj); + //IP + jfieldID f = env->GetFieldID(c,"serverHost","[B"); + jbyte a[4]; + a[0] = *(ptr->h_addr_list[0]); + a[1] = *(ptr->h_addr_list[0] +1); + a[2] = *(ptr->h_addr_list[0] +2); + a[3] = *(ptr->h_addr_list[0] +3); + jbyteArray b = env->NewByteArray(4); + env->SetByteArrayRegion(b,0,4,a); + env->SetObjectField(obj,f,b); + //Port + jfieldID f2 = env->GetFieldID(c,"serverPort","I"); + env->SetIntField(obj,f2,(jint)udp_port); + //Socket + jfieldID f3 = env->GetFieldID(c,"udtsocket","I"); + env->SetIntField(obj,f3,(jint)u); + + return JNI_TRUE; +} -//temporary UDP socket for the Hole-Punching - int temp_udp_s = -1; -//socket informationen of the servers - struct sockaddr_in srvaddr; - socklen_t len = sizeof(srvaddr); +JNIEXPORT jboolean JNICALL Java_de_fzj_unicore_uas_fts_udt_UDTSession_runSrv(JNIEnv *env, jobject p1, jint p2, jstring p3, jboolean p4){ + //the UDT server socket + UDTSOCKET u = p2; + + //the socket for the incoming connection + UDTSOCKET s; + + const char* path; + bool mode = p4; + + //socket informationen of the incoming connection + struct sockaddr_in conaddr; + int len = sizeof(conaddr); + + if((s = UDT::accept(u,(struct sockaddr*)&conaddr,&len)) == UDT::ERROR){ + UDT::close(u); + return JNI_FALSE; + } + + //get path to file + path = env->GetStringUTFChars(p3, NULL); + std::cout << "Srv:Path: " << path << std::endl; + + //TODO: change this code to file transfer code + char size[10] = "abcdefghi"; + UDT::recv(s,size,10,0); + cout << "Dateigroesse: " << size << endl; + + UDT::close(s); + UDT::close(u); + + return JNI_TRUE; +} -//socket information of the client - struct sockaddr_in cliaddr; - -//my host informationen - struct utsname myname; - struct hostent *ptr; - int udp_port; - -//save client connection information - int client_ip = -1; //this is set three lines below - int client_port = p; - -//read IP and save it - jbyte *buf = env->GetByteArrayElements(i,NULL); - char buffer[4]; - for(int il=0;il<4;++il) - buffer[il] = buf[il]; - memcpy(&client_ip,buffer,4); - - temp_udp_s = socket(AF_INET,SOCK_DGRAM,0); - if(temp_udp_s == -1) - return JNI_FALSE; - - if(uname(&myname) < 0) - return JNI_FALSE; - - if( (ptr = gethostbyname(myname.nodename)) == NULL) - return JNI_FALSE; - -//prepare server socket informationen - srvaddr.sin_addr.s_addr = *((int*)(ptr->h_addr_list[0])); - srvaddr.sin_port = 0; //any port is ok - srvaddr.sin_family = AF_INET; - - -//bind socket to a port - if(bind(temp_udp_s,(struct sockaddr *)&srvaddr,len) == -1) - return JNI_FALSE; - -//get information about the socket - getsockname(temp_udp_s,(struct sockaddr*)&srvaddr,&len); - udp_port = srvaddr.sin_port; - -//prepare socket informationen for the client - cliaddr.sin_addr.s_addr = client_ip; - cliaddr.sin_port = client_port; - cliaddr.sin_family = AF_INET; - -//send the Hole-Punching packet - char dummy = 0; - sendto(temp_udp_s,&dummy,1,0,(const struct sockaddr*)&cliaddr,sizeof(cliaddr)); - -//close the temporary UDP socket - close(temp_udp_s); - -//create UDT server socket - UDTSOCKET u = UDT::socket(AF_INET,SOCK_STREAM,0); - if(u==UDT::INVALID_SOCK) - return JNI_FALSE; - -//bind to the same port we used for the Hole-Punching - UDT::bind(u,(struct sockaddr*)&srvaddr,sizeof(srvaddr)); - -//start listening to incoming connection - UDT::listen(u,1); - -//save all results to JAVA class members (my IP, my port, UDT socket) - jclass c = env->GetObjectClass(obj); - -//IP - jfieldID f = env->GetFieldID(c,"serverHost","[B"); - jbyte a[4]; - a[0] = *(ptr->h_addr_list[0]); - a[1] = *(ptr->h_addr_list[0] +1); - a[2] = *(ptr->h_addr_list[0] +2); - a[3] = *(ptr->h_addr_list[0] +3); - jbyteArray b = env->NewByteArray(4); - env->SetByteArrayRegion(b,0,4,a); - env->SetObjectField(obj,f,b); -//Port - jfieldID f2 = env->GetFieldID(c,"serverPort","I"); - env->SetIntField(obj,f2,(jint)udp_port); -//Socket - jfieldID f3 = env->GetFieldID(c,"udtsocket","I"); - env->SetIntField(obj,f3,(jint)u); - - return JNI_TRUE; - } - - JNIEXPORT jboolean JNICALL Java_de_fzj_unicore_uas_fts_udt_UDTSession_runSrv(JNIEnv *env, jobject p1, jint p2){ - -//the UDT server socket - UDTSOCKET u = p2; - -//the socket for the incoming connection - UDTSOCKET s; - -//socket informationen of the incoming connection - struct sockaddr_in conaddr; - int len = sizeof(conaddr); - - if((s = UDT::accept(u,(struct sockaddr*)&conaddr,&len)) == UDT::ERROR) - return JNI_FALSE; - -//TODO: change this code to file transfer code - char size[10] = "abcdefghi"; - UDT::recv(s,size,10,0); - cout << "Dateigroesse: " << size << endl; - - UDT::close(s); - UDT::close(u); - - return JNI_TRUE; - } - Modified: unicorex/uas-udt/trunk/src/main/cplusplus/udt4/src/fufex.h =================================================================== --- unicorex/uas-udt/trunk/src/main/cplusplus/udt4/src/fufex.h 2008-04-28 10:42:13 UTC (rev 2838) +++ unicorex/uas-udt/trunk/src/main/cplusplus/udt4/src/fufex.h 2008-04-28 10:47:45 UTC (rev 2839) @@ -8,18 +8,18 @@ extern "C" { #endif /* - * Class: de_fzj_unicore_uas_fts_udt_UDTSession - * Method: prepareSrv - * Signature: (I[B)Z + * Class: de_fzj_unicore_uas_fts_udt_UDTSession + * Method: prepareSrv + * Signature: (I[B)Z */ - JNIEXPORT jboolean JNICALL Java_de_fzj_unicore_uas_fts_udt_UDTSession_prepareSrv(JNIEnv *, jobject, jint, jbyteArray); +JNIEXPORT jboolean JNICALL Java_de_fzj_unicore_uas_fts_udt_UDTSession_prepareSrv(JNIEnv *, jobject, jint, jbyteArray); /* - * Class: de_fzj_unicore_uas_fts_udt_UDTSession - * Method: runSrv - * Signature: (I)Z + * Class: de_fzj_unicore_uas_fts_udt_UDTSession + * Method: runSrv + * Signature: (ILjava/lang/String;Z)Z */ - JNIEXPORT jboolean JNICALL Java_de_fzj_unicore_uas_fts_udt_UDTSession_runSrv(JNIEnv *, jobject,jint); +JNIEXPORT jboolean JNICALL Java_de_fzj_unicore_uas_fts_udt_UDTSession_runSrv(JNIEnv *, jobject, jint, jstring, jboolean); /* * Class: de_fzj_unicore_uas_client_UDTClient This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |