websocket是什么,如何用C语言写一个简单的websocket客户端
时间: 2023-11-08 09:09:14 浏览: 164
RS485,websocket编程c语言源码,c语言项目
WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,它能够在浏览器和服务器之间创建持久连接,使得客户端和服务器之间的实时数据交互变得更加简单和高效。
下面是一个简单的 C 语言 WebSocket 客户端示例代码,使用了 libwebsockets 库:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <libwebsockets.h>
struct lws_context *context;
struct lws *wsi;
int interrupted;
static int callback_ws(struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len)
{
switch (reason) {
case LWS_CALLBACK_CLIENT_ESTABLISHED:
printf("WebSocket client connected\n");
break;
case LWS_CALLBACK_CLIENT_RECEIVE:
printf("Received data: %s\n", (char *)in);
break;
case LWS_CALLBACK_CLIENT_WRITEABLE:
lws_write(wsi, (unsigned char *)"Hello, server!", 14, LWS_WRITE_TEXT);
break;
case LWS_CALLBACK_CLOSED:
printf("WebSocket client closed\n");
interrupted = 1;
break;
default:
break;
}
return 0;
}
int main(int argc, char **argv)
{
struct lws_context_creation_info info;
memset(&info, 0, sizeof(info));
info.port = CONTEXT_PORT_NO_LISTEN;
info.protocols = (struct lws_protocols[]) {
{ "ws", callback_ws, 0 },
{ NULL, NULL, 0 }
};
context = lws_create_context(&info);
if (context == NULL) {
fprintf(stderr, "Error creating WebSocket client context\n");
return 1;
}
struct lws_client_connect_info connect_info;
memset(&connect_info, 0, sizeof(connect_info));
connect_info.context = context;
connect_info.address = "localhost";
connect_info.port = 8080;
connect_info.path = "/";
connect_info.host = connect_info.address;
connect_info.origin = connect_info.address;
connect_info.protocol = "ws";
wsi = lws_client_connect_via_info(&connect_info);
if (wsi == NULL) {
fprintf(stderr, "Error connecting to WebSocket server\n");
return 1;
}
while (!interrupted) {
lws_service(context, 50);
}
lws_context_destroy(context);
return 0;
}
```
该示例代码使用了 libwebsockets 库来创建 WebSocket 客户端。在 `callback_ws` 回调函数中,我们可以处理相应的事件。在本例中,当客户端与服务器建立连接时,我们会收到 `LWS_CALLBACK_CLIENT_ESTABLISHED` 事件;当接收到来自服务器的消息时,我们会收到 `LWS_CALLBACK_CLIENT_RECEIVE` 事件;当客户端与服务器断开连接时,我们会收到 `LWS_CALLBACK_CLOSED` 事件。在 `LWS_CALLBACK_CLIENT_WRITEABLE` 事件中,我们可以向服务器发送消息。
在 `main` 函数中,我们首先创建了一个 WebSocket 客户端上下文,然后使用 `lws_client_connect_via_info` 函数连接到服务器,并且通过 `lws_service` 函数来处理事件。在 `lws_service` 函数中,我们指定了一个 50 毫秒的超时时间,以避免阻塞主线程。
需要注意的是,在使用 libwebsockets 库时,需要在编译时链接 libwebsockets 库。例如:
```
gcc -o websocket-client websocket-client.c -lwebsockets
```
阅读全文