2

libwebsocketで単純な websocket サーバーを作成するために、X-Plane用の小さなプラグインを作成しようとしています。Google Chrome から Websocket に接続できますが、サーバーにデータを送信すると、X-Plane がすぐにクラッシュします。

次のコードが問題を引き起こしていると確信しています。

unsigned char *buf = (unsigned char*) malloc(LWS_SEND_BUFFER_PRE_PADDING + 13 + LWS_SEND_BUFFER_POST_PADDING);
buf = (unsigned char*) "Hello World!";
libwebsocket_write(wsi, buf, len, LWS_WRITE_TEXT);
free(buf);

私はCプログラマー/スペシャリストではありませんが、上記はまったく問題があるようですか?

完全なソースを Gist に投稿しました: https://gist.github.com/josefvanniekerk/868432986f2f963a5583

4

2 に答える 2

4

健全なインターフェースを使用すると、@iharob が正しいでしょう。明確にするために、 文字列の割り当てを誤解していることについて彼/彼女は正しいです。

ただし、libwebsockets は少し「特別」です。malloc()文字列を'd 配列のバイトにコピーする必要がありますLWS_SEND_BUFFER_PRE_PADDING。次に、libwebsockets は前のバイトを上書きします。

したがって、次のようなものが必要です(文字列の終端ゼロを送信しようとしていないと仮定します):

char *text = "Hello World!";
int len = strlen (text);
unsigned char *buf = malloc(LWS_SEND_BUFFER_PRE_PADDING + len + LWS_SEND_BUFFER_POST_PADDING);
/* copy string but not terminating NUL */
memcpy (buf + LWS_SEND_BUFFER_PRE_PADDING, text, len );
libwebsocket_write(wsi, buf + LWS_SEND_BUFFER_PRE_PADDING, len, LWS_WRITE_TEXT);
free(buf);

NUL同様に送信したい場合:

char *text = "Hello World!";
int len = strlen (text) + 1;
unsigned char *buf = malloc(LWS_SEND_BUFFER_PRE_PADDING + len + LWS_SEND_BUFFER_POST_PADDING);
/* copy string including terminating NUL */
memcpy (buf + LWS_SEND_BUFFER_PRE_PADDING, text, len );
libwebsocket_write(wsi, buf + LWS_SEND_BUFFER_PRE_PADDING, len, LWS_WRITE_TEXT);
free(buf);
于 2015-02-03T22:17:35.873 に答える
1

文字列をコピーする必要があります。割り当てが期待どおりに機能しません。

それ以外の

buf = (unsigned char *)"Hello World";

あなたが必要

memcpy(buf, "Hello World", 1 + strlen("Hello World"));

割り当てを行うときはbuf、静的文字列リテラルを指定しますfree()が、この場合は不可能です。

そのため、プログラムは未定義の動作を呼び出します。

含める必要があります<string.h>

于 2015-02-03T22:05:13.890 に答える