2017-07-17 8 views
0

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.

Antwort

0

Ich habe es durch Ändern der Flags behoben. Diese Links werden

http://www.beej.us/guide/bgnet/output/html/multipage/recvman.html

http://elixir.free-electrons.com/linux/latest/source/include/linux/socket.h#L277

Im zweiten Link können Sie alle verfügbaren Flags und eine Beschreibung einer Untergruppe dieser Flags finden konnten. Ich hatte zuvor Flag-Feld als 0 verwendet, was keine Option im Besonderen bedeutet, indem ich es in MSG_WAITALL ändere, wartet der Befehl auf die gesamte iov.len-Größe, bevor er zurückkehrt. Unvollständige empfangen haben meine Daten früher korrumpiert.

+0

@Pang, danke für die Antwort. Reicht das aus? –

+0

Was ist, wenn die ganze Nachricht nie ankommt? Hast du daran gedacht? und vielleicht testen Sie es? – Malkocoglu

Verwandte Themen