Ich habe ein Modul, das Daten in zwei Teilen empfängt. Zuerst eine Ganzzahl ohne Vorzeichen, die die Länge der Daten angibt, die als nächstes folgen werden. Dann die Daten selbst. Ich tue dies, wie in einer Endlos-Schleife folgtkernel_recvmsg bekommt manchmal falsche Daten
unsigned int z;
struct kvec vec;
struct msghdr msg;
while(1) {
memset(&vec, 0, sizeof(vec));
memset(&msg, 0, sizeof(msg));
vec.iov_base = &z;
vec.iov_len = sizeof(unsigned int);
ret = kernel_recvmsg(client_socket, &msg, &vec, 1, vec.iov_len, 0);
if(!z)
break;
data = kmalloc(z, GFP_KERNEL);
if(!data)
break;
memset(&vec, 0, sizeof(vec));
memset(&msg, 0, sizeof(msg));
vec.iov_base = data;
vec.iov_len = z;
ret = kernel_recvmsg(client_socket, &msg, &vec, 1, vec.iov_len, 0);
...
...
kfree(data);
}
Edit: Ich erhalte falsche Daten wegen unvollständiger empfängt. Mein ret < vec.iov_len. Gibt es eine Möglichkeit, dies zu umgehen?
Vielen Dank.
@Pang, danke für die Antwort. Reicht das aus? –
Was ist, wenn die ganze Nachricht nie ankommt? Hast du daran gedacht? und vielleicht testen Sie es? – Malkocoglu