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
Vous devez ajouter la déclaration de vos variables – Mansuro
Qu'en est-WSI? – Mansuro
@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