ilostmyid2 Ответов: 2

970507 - проблема в работе с websocket


В следующем коде:
#define Uses_Info
#define Uses_WebSocketServer
#include "ws.h"

int on_connect(WebSocketServer *server);
void on_message(const char *buf);
void on_disconnect();

void* CALLBACK ws_stream_on_connect(WebSocketServer *server)
{
	Info("ws_stream_on_connect");
	int n = 5;
	server->send(server, MESSAGE_TYPE_BINARY, (unsigned char *)&n, sizeof(int));
	Info("after test");
	return server;
	//on_connect(server);
	//return NULL;  // return value is not used in client.
}

size_t CALLBACK ws_stream_on_message(void *plugin_private, const WebSocketServer *server, const int type, unsigned char *buf, const size_t buf_size)
{
	//Info("ws_stream_on_message");
	on_message(buf);
	return 0;
}

void CALLBACK ws_stream_on_disconnect(void *plugin_private, const WebSocketServer *server)
{
	Info("ws_stream_on_disconnect");
	on_disconnect();
}

/*
 * Since we are returning a pointer to static memory, there is no need for a
 * "destroy" function.
 */

static WebSocketPlugin s_plugin = { sizeof(WebSocketPlugin),
                WEBSOCKET_PLUGIN_VERSION_0, NULL, /* destroy */
                ws_stream_on_connect, ws_stream_on_message,
                ws_stream_on_disconnect };

extern EXPORT WebSocketPlugin * CALLBACK ws_stream_init()
{
	Info("ws_stream_init");
    return &s_plugin;
}

Я не получаю журнал "после теста". Info-это функция, которая регистрирует строки в системном журнале. Я вижу "ws_stream_on_connect", но не этот.
В чем проблема?
ОС-Ubuntu 12.04.

Что я уже пробовал:

Я попытался посмотреть, что записано в apache2 error.log, и я также сослался на syslog, но там ничего не записано.

2 Ответов

Рейтинг:
2

Manfred Rudolf Bihy

Может быть, было сделано исключение ? Вы можете обернуть сервер-> отправить в оператор try/catch и зарегистрировать сообщение в блоке catch.

BR,
Манфред


ilostmyid2

да, я думал, что это поможет, но ничего не регистрируется. похоже, что процесс убит ненормально из-за сердечника или чего-то еще

ilostmyid2

я думаю, что такие функции, как ws_stream_on_connect, должны иметь подпись "C". таким образом, модуль имеет тип .c, а не .cpp. поэтому я не могу использовать try/catch непосредственно здесь. но я сделал это в другом модуле cpp, который эта функция называет его.

Рейтинг:
0

ilostmyid2

О, я кое-что нашел! в mod_websocket.c, в функции handle_websocket_connection, перед вызовом conf->plugin->on_connect, которая действительно является ws_stream_on_connect, apr_thread_mutex_lock вызывается в state.mutex. затем в mod_websocket_plugin_send мы снова видим блокировку. BMO, это означает, что mod_websocket.c не ожидает вызова send из ws_stream_on_connect. а ты как думаешь?
но когда я вижу код mod_websocket_plugin_send, я вижу раздел после этой блокировки, который указывает, что отправка может быть вызвана из основного потока! именно здесь вызывается mod_websocket_send_internal. как это может быть возможно?!
на данный момент я мог бы обойти эту проблему, создав поток и отправив данные из него. это будет сделано после того, как ws_stream_on_connect вернется.