2016-11-17 4 views
0

J'utilise libwebsockets-2.1.0 avec generic session & lwsws l'option activée .Libwebsockets 2.1.0 - Il est illégal de faire une lws_write en dehors de

Dans case LWS_CALLBACK_SERVER_WRITEABLE J'ai un certain code que ouvre un fichier, et affiche le contenu à websocket.

static const char* filename = "/tmp/loop.log"; 
#define MAX_STAT_LINE_LENGTH 256 

unsigned char buf[LWS_PRE + 512]; 
unsigned char *p = &buf[LWS_PRE]; 

char line[MAX_STAT_LINE_LENGTH]; 

while (fgets(line, sizeof(line), fp) != NULL) { 
    int n = lws_snprintf((char *)p, sizeof(line), "%s", line); 
    int m = lws_write(wsi, p, n, LWS_WRITE_TEXT); 

    if (m < n) { 
     printf("websocket write failed\n"); 
    } 
} 

Dans le terminal, je reçois un tas de ces derniers:

lwsws[13778]: ****** 0x9230a50: Sending new 46 (/name?ag=z&abcd=011), pending truncated ... 
It's illegal to do an lws_write outside of the writable callback: fix your code 

Y at-il une explication à cette erreur? Je veux dire, j'ai déclaré char line[1000] mais il se plaint encore.

Je voudrais souligner que la sortie finale du websocket est incompatible, parfois il arrête à line 30-something, parfois il arrête à line 400

FWIW, la ligne totale du fichier que je lis est lignes, avec la plus longue longueur de caractère d'une ligne est caractères longs.

La suppression de la boucle fgets et le remplacement de la valeur par ma propre valeur générique semblent fonctionner correctement.

Merci

+1

Vous devez ajouter la déclaration de vos variables – Mansuro

+0

Qu'en est-WSI? – Mansuro

+0

@Mansuro Je crois que WSI est une struct de lws, dans la fonction, il est déclaré comme: int callback_stats_streamer statique (struct lws * WSI, ENUM raison de lws_callback_reasons, void * utilisateur, void * dans, size_t len) { // mes codes ici } J'espère que cela a aidé. – d30jeff

Répondre

0

Le correctif est d'augmenter la taille rx buf.

#define LWS_PLUGIN_PROTOCOL_DUMB_INCREMENT \ 
{ 
    "protocol_dumb_increment", \ 
    callback_dumb_increment, \ 
    sizeof(struct per_session_data__dumb_increment), \ 
    4000, /* rx buf size must be >= permessage-deflate rx size */ \ 
} 

Source: libwebsocket's github issue page