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); } }
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); } }
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); } }
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); } }