JNIEXPORT void JNICALL Java_com_android_fogbox_NativeLib_sendFile
  (JNIEnv * env, jobject object,jstring string1, jstring string2, jstring string3)
{
	jenv = env;
	jobj = object;
	//mgr =assetmanager;
	/*if(NULL == mgr) 
	{
		__android_log_write(ANDROID_LOG_INFO, "tftp-client", "asset manager is NULL");
		exit(1);
	}*/
	
	const char *str1 = (*env)->GetStringUTFChars(env, string1, 0);
	const char *str2 = (*env)->GetStringUTFChars(env, string2, 0);
	const char *str3 = (*env)->GetStringUTFChars(env, string3, 0);
	
	__android_log_write(ANDROID_LOG_INFO, "tftp-client", "sendfile entered");
   sendRequestedFile(str1,str2,str3);

   (*env)->ReleaseStringUTFChars(env, string1, str1);
   (*env)->ReleaseStringUTFChars(env, string2, str2);
   (*env)->ReleaseStringUTFChars(env, string3, str3);
	
}
Exemple #2
0
int main(int argc, char* argv[]) {

	int listenSockFd, listenPort;
	int acceptedSockFd;
	char readBuffer[MAX_READ_BUFFER];
	char fileNotExistMsg[] = " sorry, the file you request do not exist \n";
	char stopSock[] = "stop";
	int numHeaders = 0;

	//sockaddr_in struct
	//sa_family_t    sin_family
	//in_port_t      sin_port
	//struct in_addr sin_addr
	//unsigned char  sin_zero[8]
	struct sockaddr_in serverAddr_in;
	int len_sockaddr_in = sizeof(struct sockaddr_in);
	if (argc < 2) {
		error("usage: ./tcpserver port\n");
		exit(1);
	}
	listenSockFd = socket(AF_INET,SOCK_STREAM,0);//create socket 
	listenPort = atoi(argv[1]);
	printf("the listen port is %d \n", listenPort);
	memset((char*) &serverAddr_in, '\0', sizeof(serverAddr_in));
	serverAddr_in.sin_family         = AF_INET;
    serverAddr_in.sin_addr.s_addr    = INADDR_ANY;
	serverAddr_in.sin_port           = htons(listenPort);
	// set address reuse option
	int reuseOn = 1;
	if (setsockopt(listenSockFd, SOL_SOCKET, SO_REUSEADDR, &reuseOn, sizeof reuseOn) < 0) {
	  printf("set reuse option failed\n");
	  return 1;
	}

	if (bind(listenSockFd, (struct sockaddr *)&serverAddr_in, len_sockaddr_in) < 0) {
		error("bind to port failed \n");
		exit(1);
	}

	listen(listenSockFd,MAX_CONNECTION_QUEUE);
	char clientIp[20];
	int clientPort;
	struct sockaddr_in clientAddr;
	socklen_t addrLen = sizeof (struct sockaddr_in);
	acceptedSockFd = accept(listenSockFd, (struct sockaddr *)&clientAddr, &addrLen);
	if (acceptedSockFd >= 0) {
	  clientPort = ntohs(clientAddr.sin_port);
	  memset(clientIp, 0, sizeof clientIp);
	  inet_ntop(AF_INET, &(clientAddr.sin_addr), clientIp, 19);
	  printf("start to serve request from client %s:%d\n", clientIp, clientPort);
	} else {
	  printf("failed to accept new request\n");
	  shutdown(listenSockFd, SHUT_RDWR);
	  close(listenSockFd);
	  return 1;
	}
	//accept new connection 
	while (1) {
		memset(readBuffer,'\0',sizeof(readBuffer));
		Request * request = (Request*) malloc(sizeof(Request));
		request->isResolved = 0;
		request->isAlive = no_persistent;
		request->content_len = 0;
		if (getLineFromSock(acceptedSockFd, readBuffer, sizeof(readBuffer)-1) > 0) {//read request line
			//parse requestline successfully
			if (parseHttpRequestLine(readBuffer, strlen(readBuffer), &(request->requestLine)) >= 0){
				printf("parsed requestline path is %s\n", request->requestLine.path);
				//read each header per line, end by a blank line
				numHeaders = 0;
				memset(readBuffer,'\0',sizeof(readBuffer));
				while (getLineFromSock(acceptedSockFd, readBuffer, sizeof(readBuffer)-1) > 0) { 
					request->headers[numHeaders] = (Header*) malloc(sizeof(Header));
					if ( parseHeader(readBuffer, strlen(readBuffer), request->headers[numHeaders]) > 0) {
						printf("parsed header name %s  value %s\n",request->headers[numHeaders]->name, request->headers[numHeaders]->value);
						// get connect alive status
						if (strcmp(request->headers[numHeaders]->name, "Connection") == 0) {
							if (strcmp(request->headers[numHeaders]->value, "keep-alive") == 0) {
								request->isAlive = persistent;
							} else {
								request->isAlive = no_persistent;
							}
						}
						// get content length
						if (strcmp(request->headers[numHeaders]->name, "Content-Length") == 0) {
							request->content_len = atoi(request->headers[numHeaders]->value);
						}
						memset(readBuffer,'\0',sizeof(readBuffer));
						numHeaders++;
					} else {
						free(request->headers[numHeaders]);
						printf("pare header failed: \n%s\n", readBuffer);
						break;
					}
				}
				if ( numHeaders ) {
					request->isResolved = 1;
				}
				
			} 
			printf("start to send reques file %s to client %s:%d\n", request->requestLine.path, clientIp, clientPort);
			//send requested file to client
			if (sendRequestedFile(acceptedSockFd, request) < 0) {
				printf("\nsend requested file %s  to client %s:%d failed\n", request->requestLine.path, clientIp, clientPort);
			} else {
				printf("\nsucceed to send requested file %s  to client %s:%d\n", request->requestLine.path, clientIp, clientPort);
			}
		} else {
		  printf("no request from client %s:%d for %d seconds, so close it\n", clientIp, clientPort, MAX_WAIT_SECONDS);
		  shutdown(acceptedSockFd, SHUT_RDWR);
		  close(acceptedSockFd);
		  if (request != NULL) {
			free(request);
		  }
		  printf("close connection from client %s:%d\n", clientIp, clientPort);
		  printf("ready to accept new connection, if you want to stop me, ctrl-C\n");
		  acceptedSockFd = accept(listenSockFd, (struct sockaddr *)&clientAddr, &addrLen);
		  if (acceptedSockFd >= 0) {
			clientPort = ntohs(clientAddr.sin_port);
			memset(clientIp, 0, sizeof clientIp);
			inet_ntop(AF_INET, &(clientAddr.sin_addr), clientIp, 19);
			printf("start to serve request from client %s:%d\n", clientIp, clientPort);
		  } else {
			printf("failed to accept new request\n");
			shutdown(listenSockFd, SHUT_RDWR);
			close(listenSockFd);
			return 1;
		  }
		  continue;
		}


		enum KeepAlive isAlive = request->isAlive; 
		//free dynamically allocated memory
		int i;
		for (i = 0; i< numHeaders; i++) {
			free(request->headers[i]);
		}
		free(request);

		if (isAlive != persistent) {
		  shutdown(acceptedSockFd, SHUT_RDWR);
		  close(acceptedSockFd);
		  printf("close connection from client %s:%d\n", clientIp, clientPort);
		  printf("read to accept new connection, if you want to stop me, ctrl-C\n");
		  acceptedSockFd = accept(listenSockFd, (struct sockaddr *)&clientAddr, &addrLen);
		  if (acceptedSockFd >= 0) {
			clientPort = ntohs(clientAddr.sin_port);
			memset(clientIp, 0, sizeof clientIp);
			inet_ntop(AF_INET, &(clientAddr.sin_addr), clientIp, 19);
			printf("start to serve request from client %s:%d\n", clientIp, clientPort);
		  } else {
			printf("failed to accept new request\n");
			shutdown(listenSockFd, SHUT_RDWR);
			close(listenSockFd);
			return 1;
		  }
		}
	}
	shutdown(listenSockFd,SHUT_RDWR);
	close(listenSockFd);
}