- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我试图找到一个示例来解释如何使用 libwebsocket 实现客户端,但我没有得到任何令人信服的代码。有什么链接可以引用吗?
最佳答案
更正了 Ren-Wei Luo 的代码示例以使用 libwebsockets 1.6
在 Ubuntu 14.04 上测试
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <libwebsockets.h>
#define KGRN "\033[0;32;32m"
#define KCYN "\033[0;36m"
#define KRED "\033[0;32;31m"
#define KYEL "\033[1;33m"
#define KMAG "\033[0;35m"
#define KBLU "\033[0;32;34m"
#define KCYN_L "\033[1;36m"
#define RESET "\033[0m"
static int destroy_flag = 0;
static void INT_HANDLER(int signo) {
destroy_flag = 1;
}
/* *
* websocket_write_back: write the string data to the destination wsi.
*/
int websocket_write_back(struct lws *wsi_in, char *str, int str_size_in)
{
if (str == NULL || wsi_in == NULL)
return -1;
int n;
int len;
char *out = NULL;
if (str_size_in < 1)
len = strlen(str);
else
len = str_size_in;
out = (char *)malloc(sizeof(char)*(LWS_SEND_BUFFER_PRE_PADDING + len + LWS_SEND_BUFFER_POST_PADDING));
//* setup the buffer*/
memcpy (out + LWS_SEND_BUFFER_PRE_PADDING, str, len );
//* write out*/
n = lws_write(wsi_in, out + LWS_SEND_BUFFER_PRE_PADDING, len, LWS_WRITE_TEXT);
printf(KBLU"[websocket_write_back] %s\n"RESET, str);
//* free the buffer*/
free(out);
return n;
}
static int ws_service_callback(
struct lws *wsi,
enum lws_callback_reasons reason, void *user,
void *in, size_t len)
{
switch (reason) {
case LWS_CALLBACK_ESTABLISHED:
printf(KYEL"[Main Service] Connection established\n"RESET);
break;
//* If receive a data from client*/
case LWS_CALLBACK_RECEIVE:
printf(KCYN_L"[Main Service] Server recvived:%s\n"RESET,(char *)in);
//* echo back to client*/
websocket_write_back(wsi ,(char *)in, -1);
break;
case LWS_CALLBACK_CLOSED:
printf(KYEL"[Main Service] Client close.\n"RESET);
break;
default:
break;
}
return 0;
}
struct per_session_data {
int fd;
};
int main(void) {
// server url will usd port 5000
int port = 5000;
const char *interface = NULL;
struct lws_context_creation_info info;
struct lws_protocols protocol;
struct lws_context *context;
// Not using ssl
const char *cert_path = NULL;
const char *key_path = NULL;
// no special options
int opts = 0;
//* register the signal SIGINT handler */
struct sigaction act;
act.sa_handler = INT_HANDLER;
act.sa_flags = 0;
sigemptyset(&act.sa_mask);
sigaction( SIGINT, &act, 0);
//* setup websocket protocol */
protocol.name = "my-echo-protocol";
protocol.callback = ws_service_callback;
protocol.per_session_data_size=sizeof(struct per_session_data);
protocol.rx_buffer_size = 0;
//* setup websocket context info*/
memset(&info, 0, sizeof info);
info.port = port;
info.iface = interface;
info.protocols = &protocol;
info.extensions = lws_get_internal_extensions();
info.ssl_cert_filepath = cert_path;
info.ssl_private_key_filepath = key_path;
info.gid = -1;
info.uid = -1;
info.options = opts;
//* create libwebsocket context. */
context = lws_create_context(&info);
if (context == NULL) {
printf(KRED"[Main] Websocket context create error.\n"RESET);
return -1;
}
printf(KGRN"[Main] Websocket context create success.\n"RESET);
//* websocket service */
while ( !destroy_flag ) {
lws_service(context, 50);
}
usleep(10);
lws_context_destroy(context);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <libwebsockets.h>
#define KGRN "\033[0;32;32m"
#define KCYN "\033[0;36m"
#define KRED "\033[0;32;31m"
#define KYEL "\033[1;33m"
#define KBLU "\033[0;32;34m"
#define KCYN_L "\033[1;36m"
#define KBRN "\033[0;33m"
#define RESET "\033[0m"
static int destroy_flag = 0;
static int connection_flag = 0;
static int writeable_flag = 0;
static void INT_HANDLER(int signo) {
destroy_flag = 1;
}
struct session_data {
int fd;
};
struct pthread_routine_tool {
struct lws_context *context;
struct lws *wsi;
};
static int websocket_write_back(struct lws *wsi_in, char *str, int str_size_in)
{
if (str == NULL || wsi_in == NULL)
return -1;
int n;
int len;
char *out = NULL;
if (str_size_in < 1)
len = strlen(str);
else
len = str_size_in;
out = (char *)malloc(sizeof(char)*(LWS_SEND_BUFFER_PRE_PADDING + len + LWS_SEND_BUFFER_POST_PADDING));
//* setup the buffer*/
memcpy (out + LWS_SEND_BUFFER_PRE_PADDING, str, len );
//* write out*/
n = lws_write(wsi_in, out + LWS_SEND_BUFFER_PRE_PADDING, len, LWS_WRITE_TEXT);
printf(KBLU"[websocket_write_back] %s\n"RESET, str);
//* free the buffer*/
free(out);
return n;
}
static int ws_service_callback(
struct lws *wsi,
enum lws_callback_reasons reason, void *user,
void *in, size_t len)
{
switch (reason) {
case LWS_CALLBACK_CLIENT_ESTABLISHED:
printf(KYEL"[Main Service] Connect with server success.\n"RESET);
connection_flag = 1;
break;
case LWS_CALLBACK_CLIENT_CONNECTION_ERROR:
printf(KRED"[Main Service] Connect with server error.\n"RESET);
destroy_flag = 1;
connection_flag = 0;
break;
case LWS_CALLBACK_CLOSED:
printf(KYEL"[Main Service] LWS_CALLBACK_CLOSED\n"RESET);
destroy_flag = 1;
connection_flag = 0;
break;
case LWS_CALLBACK_CLIENT_RECEIVE:
printf(KCYN_L"[Main Service] Client recvived:%s\n"RESET, (char *)in);
if (writeable_flag)
destroy_flag = 1;
break;
case LWS_CALLBACK_CLIENT_WRITEABLE :
printf(KYEL"[Main Service] On writeable is called. send byebye message\n"RESET);
websocket_write_back(wsi, "Byebye! See you later", -1);
writeable_flag = 1;
break;
default:
break;
}
return 0;
}
static void *pthread_routine(void *tool_in)
{
struct pthread_routine_tool *tool = tool_in;
printf(KBRN"[pthread_routine] Good day. This is pthread_routine.\n"RESET);
//* waiting for connection with server done.*/
while(!connection_flag)
usleep(1000*20);
//*Send greeting to server*/
printf(KBRN"[pthread_routine] Server is ready. send a greeting message to server.\n"RESET);
websocket_write_back(tool->wsi, "Good day", -1);
printf(KBRN"[pthread_routine] sleep 2 seconds then call onWritable\n"RESET);
sleep(1);
printf(KBRN"------------------------------------------------------\n"RESET);
sleep(1);
//printf(KBRN"[pthread_routine] sleep 2 seconds then call onWritable\n"RESET);
//*involked wriable*/
printf(KBRN"[pthread_routine] call on writable.\n"RESET);
lws_callback_on_writable(tool->wsi);
}
int main(void)
{
//* register the signal SIGINT handler */
struct sigaction act;
act.sa_handler = INT_HANDLER;
act.sa_flags = 0;
sigemptyset(&act.sa_mask);
sigaction( SIGINT, &act, 0);
struct lws_context *context = NULL;
struct lws_context_creation_info info;
struct lws *wsi = NULL;
struct lws_protocols protocol;
memset(&info, 0, sizeof info);
info.port = CONTEXT_PORT_NO_LISTEN;
info.iface = NULL;
info.protocols = &protocol;
info.ssl_cert_filepath = NULL;
info.ssl_private_key_filepath = NULL;
info.extensions = lws_get_internal_extensions();
info.gid = -1;
info.uid = -1;
info.options = 0;
protocol.name = "my-echo-protocol";
protocol.callback = &ws_service_callback;
protocol.per_session_data_size = sizeof(struct session_data);
protocol.rx_buffer_size = 0;
protocol.id = 0;
protocol.user = NULL;
context = lws_create_context(&info);
printf(KRED"[Main] context created.\n"RESET);
if (context == NULL) {
printf(KRED"[Main] context is NULL.\n"RESET);
return -1;
}
wsi = lws_client_connect(context, "localhost", 5000, 0,
"/", "localhost:5000", NULL,
protocol.name, -1);
if (wsi == NULL) {
printf(KRED"[Main] wsi create error.\n"RESET);
return -1;
}
printf(KGRN"[Main] wsi create success.\n"RESET);
struct pthread_routine_tool tool;
tool.wsi = wsi;
tool.context = context;
pthread_t pid;
pthread_create(&pid, NULL, pthread_routine, &tool);
pthread_detach(pid);
while(!destroy_flag)
{
lws_service(context, 50);
}
lws_context_destroy(context);
return 0;
}
.PHONY:clean
all:example-client example-server
example-client:example-client.c
gcc example-client.c -o example-client -lpthread -lwebsockets
example-server:example-server.c
gcc example-server.c -o example-server -lwebsockets
clean:
-rm example-client example-server
关于c - Libwebsocket 客户端示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30904560/
我正在使用libwebsockets-2.1.0具有通用 session 和lwsws选项启用。 在 LWS_CALLBACK_SERVER_WRITEABLE 情况下,我有一些代码可以打开文件,并将
供您引用(因为我在下面提到了库函数),可以在此处找到 libwebsockets 文档:https://github.com/warmcat/libwebsockets/blob/master/lib
我正在让 libwebsocket 客户端发送二进制数据。我已将我的二进制数据保存到缓冲区中 [即buf] 并写入套接字。 n = libwebsocket_write(wsi, &bu
当我尝试从客户端向服务器发送数据时,它显示“lwsts[9972]:从skt读取时出错”。我在互联网上搜索过,没有明确的表达。我按照 LibWebSockets 包中的 test_server.c 示
我目前正在构建一个 WebSocket 服务器,我遇到了以下代码来处理碎片消息(来自 libwebsockets ): case LWS_CALLBACK_RECEIVE: { Client
我正在 Linux 上使用 libwebsocket lib 开发一个简单的 websocket 服务器。 我需要为每个客户端连接的已建立事件发送一个初始化数据包。 如果我使用 memcpy( p,
我正在使用 libwebsockets而且我无法编译自己实现的演示代码。 我创建了上下文: struct libwebsocket_context *context; ... context = li
我正在使用 libwebsockets 2.0,但在尝试使用它作为客户端连接到服务器时遇到了一些问题。 根据 libwebsockets 日志,这是当我相当简单的客户端尝试连接到 echo.webso
我试图找到一个示例来解释如何使用 libwebsocket 实现客户端,但我没有得到任何令人信服的代码。有什么链接可以引用吗? 最佳答案 更正了 Ren-Wei Luo 的代码示例以使用 libweb
我正在尝试运行与 LWS 库一起安装的“libwebsockets-test-server”,但它无法运行,因为“lwsts[31616]: libuv 支持未编译”。 我已经检查过是否安装了 lib
我正在尝试为 X-Plane 编写一个小插件,使用 libwebsocket 创建一个简单的 websocket 服务器。我可以从 Google Chrome 连接到 websocket,但是,当我向
我想创建一个 Web 应用程序,只要 C++ 后端有新内容,一组用户就可以异步接收一些数据。因此,理想情况下,当新用户到来时,他将被添加到订阅者列表中,并且每当 C++ 后端有该组的新数据时,它就会将
这是 libwebsocket_client_connect() 的签名。 struct libwebsocket * libwebsocket_client_connect (struct libw
我正在查看 C websocket 库 libwebsockets 客户端示例。 但是我不明白示例的目的是什么。 Here是这个例子,这个例子有两个连接(在代码 wsi_dumb 和 wsi_mirr
如何在 libwebsockets 回调中设置用户自定义指针? 我在 lws_protocol 中添加了一个指针变量。 调用回调函数时,用户指针始终为NULL。 我使用 libwebsockets v
我正在尝试实现一个 websocket 客户端(使用 C 中的 libwebsockets)。我正在使用 cmake 来控制软件编译过程。 我的问题很简单:如何使用 Libwebsockets 启用调
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 6 年前。
我正在尝试使用 libwebsockets 创建一个 C++ websocket 客户端,但由于超时,我无法建立连接。我已经剥离了测试的内容,这是我用来建立连接的内容: 协议(protocol) st
我将 warmcat 的 libwebsocket C 库用于小型 websocket 服务器。我已经启动并运行了这些示例,并且可以发送数据以响应从 websocket 接收的数据(例如回显发送的反向
我正在使用 libwebsockets同时运行 websocket 服务器和客户端(实际上在同一个可执行文件中)。有没有办法优雅地关闭连接? 我知道我可以在我的回调函数中返回一个负整数来使连接中止,但
我是一名优秀的程序员,十分优秀!