Компилятор 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")
}