Компилятор Kotlin/native не может использовать функции inet_addr, htons и т. Д.

Я хотел бы написать простую программу с сокетным соединением в kotlin/native:

Есть простая функция, которая открывает и привязывает сокет.

actual fun openSocket(endpoint: IpPort): Socket {
    // Initialize sockets in platform-dependent way.
    init_sockets()
    var socketDescriptor = 0
    memScoped {
        val serverAddr = alloc<sockaddr_in>()
        socketDescriptor = socket(AF_INET, SOCK_STREAM, 0)
            .ensureUnixCallResult("socket") { !it.isMinusOne() }
        with(serverAddr) {
            memset(this.ptr, 0, sockaddr_in.size.narrow())
            sin_family = AF_INET.convert()
            sin_addr.s_addr = inet_addr(endpoint.cstr.ptr); /
            //sin_port = htons(endpoint.port.convert()) 
        }
        bind(socketDescriptor, serverAddr.ptr.reinterpret(), sockaddr_in.size.convert())
            .ensureUnixCallResult("bind") { it == 0 }
    }
    return Socket(socketDescriptor)
}

Компилятор (./gradlew compileKonan) не может разрешить функции: inet_addr, htons, Также импортер компилятора import platform.ios.*, Я думаю, что эти функции должны быть в заголовках системы iOS (и любой другой ОС).

Есть build.gradle из

apply plugin: 'konan'

konan.targets = ['iphone']

konanArtifacts {
    framework('MezzoCore') {
        enableMultiplatform true   
    }
}

dependencies {
    expectedBy project(':common')
}

Я не могу понять, что я делаю неправильно. Может кто-нибудь мне помочь?

1 ответ

Следующее может помочь:

import platform.posix.*
import platform.darwin.*
import kotlinx.cinterop.*

// Just to avoid import conflict.
typealias sockaddr_in = platform.posix.sockaddr_in

fun main() {
   val endpoint ="127.0.0.1"
   val port = 8080
   var socketDescriptor = 0
   memScoped {
       val serverAddr = alloc<sockaddr_in>()
       socketDescriptor = socket(AF_INET, SOCK_STREAM, 0)
       with(serverAddr) {
           memset(this.ptr, 0, sockaddr_in.size.convert())
           sin_family = AF_INET.convert()
           sin_addr.s_addr = inet_addr(endpoint)
           sin_port = ((port shr 8) or ((port and 0xff) shl 8)).toUShort()
        }
        bind(socketDescriptor, serverAddr.ptr.reinterpret(), 
                 sockaddr_in.size.convert())
     }
     println("sd=$socketDescriptor")   
}
Другие вопросы по тегам