示例#1
0
void Java_com_apress_echo_EchoServerActivity_nativeStartUdpServer(
		JNIEnv* env,
		jobject obj,
		jint port)
{
	// Construct a new UDP socket.
	int serverSocket = NewUdpSocket(env, obj);
	if (NULL == env->ExceptionOccurred())
	{
		// Bind socket to a port number
		BindSocketToPort(env, obj, serverSocket, (unsigned short) port);
		if (NULL != env->ExceptionOccurred())
			goto exit;

		// If random port number is requested
		if (0 == port)
		{
			// Get the port number socket is currently binded
			GetSocketPort(env, obj, serverSocket);
			if (NULL != env->ExceptionOccurred())
				goto exit;
		}

		// Client address
		struct sockaddr_in address;
		memset(&address, 0, sizeof(address));

		char buffer[MAX_BUFFER_SIZE];
		ssize_t recvSize;
		ssize_t sentSize;

		// Receive from the socket
		recvSize = ReceiveDatagramFromSocket(env, obj, serverSocket,
				&address, buffer, MAX_BUFFER_SIZE);

		if ((0 == recvSize) || (NULL != env->ExceptionOccurred()))
			goto exit;

		// Send to the socket
		sentSize = SendDatagramToSocket(env, obj, serverSocket,
				&address, buffer, (size_t) recvSize);
	}

exit:
	if (serverSocket > 0)
	{
		close(serverSocket);
	}
}
示例#2
0
JNIEXPORT void JNICALL Java_com_example_hellojni_Native_nativeStartTcpServer
(JNIEnv *env, jobject obj, jint port) {
// Construct a new TCP socket.
    int serverSocket = NewTcpSocket(env, obj);
    if (NULL == env->ExceptionOccurred())
    {
        // Bind socket to a port number
        BindSocketToPort(env, obj, serverSocket, (unsigned short) port);
        if (NULL != env->ExceptionOccurred())
            goto exit;

        // If random port number is requested
        if (0 == port)
        {
            // Get the port number socket is currently binded
            GetSocketPort(env, obj, serverSocket);
            if (NULL != env->ExceptionOccurred())
                goto exit;
        }

        // Listen on socket with a backlog of 4 pending connections
        ListenOnSocket(env, obj, serverSocket, 4);
        if (NULL != env->ExceptionOccurred())
            goto exit;

        // Accept a client connection on socket
        int clientSocket = AcceptOnSocket(env, obj, serverSocket);
        if (NULL != env->ExceptionOccurred())
            goto exit;

        char buffer[MAX_BUFFER_SIZE];
        ssize_t recvSize;
        ssize_t sentSize;

        // Receive and send back the data
        while (1)
        {
            // Receive from the socket
            recvSize = ReceiveFromSocket(env, obj, clientSocket,
                                         buffer, MAX_BUFFER_SIZE);

            if ((0 == recvSize) || (NULL != env->ExceptionOccurred()))
                break;

            // Send to the socket
            char prefix[] = "Server: ";
            char toSend[MAX_BUFFER_SIZE + strlen(prefix)];
            strcpy(toSend, prefix);
            strcat(toSend, buffer);
            sentSize = SendToSocket(env, obj, clientSocket,
                                    toSend, (size_t) strlen(toSend));
            if ((0 == sentSize) || (NULL != env->ExceptionOccurred()))
                break;
        }

        // Close the client socket
        close(clientSocket);
    }

exit:
    if (serverSocket > 0)
    {
        close(serverSocket);
    }
}
示例#3
0
void Java_com_apress_echo_EchoServerActivity_nativeStartTcpServer(
		JNIEnv* env,
		jobject obj,
		jint port)
{
	// Construct a new TCP socket.
	int serverSocket = NewTcpSocket(env, obj);
	if (NULL == env->ExceptionOccurred())
	{
		// Bind socket to a port number
		BindSocketToPort(env, obj, serverSocket, (unsigned short) port);
		if (NULL != env->ExceptionOccurred())
			goto exit;

		// If random port number is requested
		if (0 == port)
		{
			// Get the port number socket is currently binded
			GetSocketPort(env, obj, serverSocket);
			if (NULL != env->ExceptionOccurred())
				goto exit;
		}

		// Listen on socket with a backlog of 4 pending connections
		ListenOnSocket(env, obj, serverSocket, 4);
		if (NULL != env->ExceptionOccurred())
			goto exit;

		// Accept a client connection on socket
		int clientSocket = AcceptOnSocket(env, obj, serverSocket);
		if (NULL != env->ExceptionOccurred())
			goto exit;

		char buffer[MAX_BUFFER_SIZE];
		ssize_t recvSize;
		ssize_t sentSize;

		// Receive and send back the data
		while (1)
		{
			// Receive from the socket
			recvSize = ReceiveFromSocket(env, obj, clientSocket,
					buffer, MAX_BUFFER_SIZE);

			if ((0 == recvSize) || (NULL != env->ExceptionOccurred()))
				break;

			// Send to the socket
			sentSize = SendToSocket(env, obj, clientSocket,
					buffer, (size_t) recvSize);

			if ((0 == sentSize) || (NULL != env->ExceptionOccurred()))
				break;
		}

		// Close the client socket
		close(clientSocket);
	}

exit:
	if (serverSocket > 0)
	{
		close(serverSocket);
	}
}
示例#4
0
JNIEXPORT void JNICALL Java_com_example_hellojni_Native_nativeStartUdpServer
(JNIEnv *env, jobject obj, jint port)
{
    // Construct a new UDP socket.
    int serverSocket = NewUdpSocket(env, obj);
    if (NULL == env->ExceptionOccurred())
    {
        LOGD("Create UDP Socket...");
        // Bind socket to a port number
        BindSocketToPort(env, obj, serverSocket, (unsigned short) port);
        if (NULL != env->ExceptionOccurred())
            goto exit;

        // If random port number is requested
        if (0 == port)
        {
            // Get the port number socket is currently binded
            GetSocketPort(env, obj, serverSocket);
            if (NULL != env->ExceptionOccurred())
                goto exit;
        }

        struct sockaddr_in serv;
        char serv_ip[20];
        socklen_t serv_len = sizeof(serv);
        getsockname(serverSocket, (struct sockaddr *)&serv, &serv_len);
        inet_ntop(AF_INET, &serv.sin_addr, serv_ip, sizeof(serv_ip));
        LogMessage(env, obj, "Server on %s:%d\n", serv_ip, ntohs(serv.sin_port));
        // LogMessage(env, obj, "Server on %s:%d\n", serv_ip, ntohs(serv.sin_port));
        while (1) {
            // Client address
            struct sockaddr_in address;
            memset(&address, 0, sizeof(address));

            char buffer[MAX_BUFFER_SIZE];
            ssize_t recvSize;
            ssize_t sentSize;
            // Receive from the socket
            recvSize = ReceiveDatagramFromSocket(env, obj, serverSocket,
                                                 &address, buffer, MAX_BUFFER_SIZE);
            LOGD("Received from %s:%hu."
                 , inet_ntoa(address.sin_addr), ntohs(address.sin_port));
            LOGD("Received %hu bytes: %s", recvSize, buffer);
            // LogMessage(env, obj, "Received from %s:%hu"
            //            , inet_ntoa(address.sin_addr), ntohs(address.sin_port));
            // LogMessage(env, obj, "Received %hu bytes: %s", recvSize, buffer);


            if ((0 == recvSize) || (NULL != env->ExceptionOccurred()))
                goto exit;

            // Send to the socket
            // combine data
            char prefix[] = "Server: ";
            char buffer2[MAX_BUFFER_SIZE + strlen(prefix)];
            strcpy(buffer2, prefix);
            strcat(buffer2, buffer);
            sentSize = SendDatagramToSocket(env, obj, serverSocket,
                                            &address, buffer2, (size_t) recvSize);
        }
    }

exit:
    if (serverSocket > 0)
    {
        close(serverSocket);
    }
}