最后更新:2022-05-18 22:32:44 手机定位技术交流文章
Wayland 这只是一场表演。 server (Wayland compositor )与 client 间的 通信协议 ,
而 Weston 它属于韦德兰综合体 参考实现 。
Wayland基 域域内的套接字 显示仪和阴蒂 通信的库 请接受我的道歉,csdn./article/details/4026449@Jinzhuojun以XML的形式,还创建了一套可扩缩的通信协议。韦兰是这项协议的分歧。 核心协定和延期协定 韦斯顿是韦斯顿作为韦德兰复合体的参考物,通常与韦德兰同时释放。
Wayland协议主要提供与服务器端合成器的 Clitenendend 。 通信机制 韦兰交易的最基本组成部分是提供其中一项。 面向对象的 跨进程过程调用 的功能 和安东机器人相似 的Binder 与Binder不同的是,Wayland的客户和服务器通过底部。 连接到域名套接字 。 Binder 等域储量便利了 fd 跨流程的传输,这是传输图形缓冲和共享内存的基础。 客户端和服务器端位于信息循环的同一侧。 有关插座的数据正在等待中 。 ,拿到数据后经过 反序列化处理 生成本地的 函数调用 ,然后呼唤;另一方面,来自遥远地方的呼唤 请求封装序列化 之后通过插座将它转移。 消息循环 ,表示通话没有同步;然而,通过等待服务器结束程序结束后收到事件,通话可以同步进行。
在套接字结构中,为使用创建了 UNIX 域套接字。 同一台主机 IPC代表程序间沟通。
特点:
一. 不需要通过网络协议存储处。它不需要打包、计算校验和、保留序列号、答复等等。
二,只是程序应用层数据 拷贝到 另一个进程。
工作模式:
SOCK_DGRAM 类似于 UDP 。
Sock_STREAM类似于TCP。
用途:
目前最广泛使用的IPC方法是UNIX Done域索克特,可同时用于两个非家庭进程。
例如,UNIX Domene Socket被用于 X Windows 服务器和 GUI 软件之间的通信。
二、工作流程
与 websocket 的区别 :
一,我不知道你在谈论什么, 但我不知道你在谈论什么, 但我不知道你在谈论什么。 AF_UNIX
2. unix d 我不需要它。 我不需要它。 I don't need it. IP和端口 ,取而代之的是 文件路径 来表示“网络地址”
原理:
UNIXDomain socket 定义了类型套接字文件的文件系统中使用结构 sockaddr_un 的路径 。
此套接字文件是由绑定 () 函数创建的, 如果绑定 () 文件在调用时已经存在, 则绑定 () 返回错误 。
UNIX 域 Socket 客户端经常发出可见的电话。 bind 函数,而不是像网络套接字一样依赖系统指定的地址。
客户端绑定的套接字名可能包含 客户端的pid ,使服务器能够区分不同的客户端
工作流程:
建立标签 - 绑定文件( ports) - 听 - 接受客户端连接 - 接收/ 发送数据 - 关闭
客户端: 以 Locket - 捆绑文件( 端口) - 连接 - 发送/ 接收数据 -.. - 退出
三. 无阻塞和阻塞(SOCK_STREAM方法)
阅读和写作有两种方法:块式和非块式。
1.阻塞模式下
在干扰模式中,发送者和接收者的行为类似于命名管道。
2.非阻塞模式
在发送或校正函数中设置 MSG_DontWAIT 符号参数,以及发送和接收返回。如果失败,返回值 1 错误为 EAGAIN 或 EWOUDBLOCK 。
四.实例
服务端代码:
#include <stdio.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <errno.h>
#include <stddef.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
#include <stdlib.h>
#define UNIX_DOMAIN "/data/local/tmp/ndk_cmd"
int main(void) {
int listen_fd = socket(PF_UNIX, SOCK_STREAM, 0);
if (listen_fd < 0) {
perror("cannot create communication socketn");
return 1;
}
//set server addr_param
struct sockaddr_un srv_addr;
srv_addr.sun_family = AF_UNIX ;
strncpy(srv_addr.sun_path, UNIX_DOMAIN, sizeof(srv_addr.sun_path) - 1);
unlink (UNIX_DOMAIN);
//bind sockfd & addr
int ret = bind (listen_fd, (struct sockaddr*) &srv_addr, sizeof(srv_addr));
if (ret == -1) {
perror("cannot bind server socket");
close(listen_fd);
unlink(UNIX_DOMAIN);
return 1;
}
//listen sockfd
ret = listen (listen_fd, 1);
if (ret == -1) {
perror("cannot listen the client connect request");
close(listen_fd);
unlink(UNIX_DOMAIN);
return 1;
}
//have connect request use accept
struct sockaddr_un clt_addr;
int len = sizeof(clt_addr);
int com_fd = accept (listen_fd, (struct sockaddr*) &clt_addr, &len);
if (com_fd < 0) {
perror("cannot accept client connect request");
close(listen_fd);
unlink(UNIX_DOMAIN);
return 1;
}
//read and printf sent client info
printf("/n=====info=====/n");
static char recv_buf[1024];
for (int i = 0; i < 4; i++) {
memset(recv_buf, 0, 1024);
int num = read (com_fd, recv_buf, sizeof(recv_buf));
printf("Message from client (%d)) :%sn", num, recv_buf);
}
close(com_fd);
close(listen_fd);
unlink(UNIX_DOMAIN);
return 0;
}
客户端代码:
#include <stdio.h>
#include <stddef.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
#include <stdlib.h>
int main(void) {
//creat unix socket
int connect_fd = socket(PF_UNIX, SOCK_STREAM, 0);
if (connect_fd < 0) {
perror("cannot create communication socket");
return 1;
}
static struct sockaddr_un srv_addr;
srv_addr.sun_family = AF_UNIX;
strcpy(srv_addr.sun_path, "/data/local/tmp/ndk_cmd");
//connect server
int ret = connect(connect_fd, (struct sockaddr*) &srv_addr, sizeof(srv_addr));
if (ret == -1) {
perror("cannot connect to the server");
close(connect_fd);
return 1;
}
char snd_buf[1024];
memset(snd_buf, 0, 1024);
strcpy(snd_buf, "message from client");
//send info server
for (int i = 0; i < 4; i++)
write(connect_fd, snd_buf, sizeof(snd_buf));
close(connect_fd);
return 0;
}
索科特,索科特,叫林努 跨进程通信 (详情见IPC, 流程间公司。 )Linux流程通信摘要这种插座比任何其它 IPC 机制都优越, 同一台主机内 各进程之间的沟通,这仍然有可能。 不同主机间 的跨进程通信。 通信域套接字有两种类型: Unix 域套接字和 Internet 域套接字。
main(int argc, char **argv) simple-shm.c
{
struct sigaction sigint;
struct display *display;
struct window *window;
int ret = 0;
display = create_display (); {
display->display = wl_display_connect(NULL);
wl_display_roundtrip(display->display);
}
window = create_
window
(display, 250, 250);
if (!window)
return 1;
{
xdg_wm_base_get_xdg_surface(display->wm_base,
window->surface);
assert(window->xdg_surface);
xdg_surface_add_listener(window->xdg_surface,
&xdg_surface_listener, window);
}
sigint.sa_handler = signal_int;
sigemptyset(&sigint.sa_mask);
sigint.sa_flags = SA_RESETHAND;
sigaction(SIGINT, &sigint, NULL);
/* Initialise damage to full surface, so the padding gets painted */
wl_
surface_damage
(window->surface, 0, 0,
window->width, window->height);
if (!window->wait_for_configure)
redraw
(window, NULL, 0);
while (running && ret != -1)
ret = wl_display_dispatch(display->display);
fprintf(stderr, "simple-shm exitingn");
destroy_window(window);
destroy_display(display);
return 0;
}
一、基本 工作流程
考虑Weston自己的程序,简单Shm,观察客户如何通过Wayland协议和复合软件进行沟通。
1. 连接到服务器并绑定服务 。
display->display = wl_display_connect() // 通过 用服务器创建套接字 端的连接,得到 wl_display 。它即代表了 在服务器上显示资源 同时也是一个代理 wl_ proxy 。 客户端可以使用此选项打电话, 从服务器端获取事件 。
display->registry = wl_display_get_registry(display->display) // 申请创建registry,得到代理对象 wl_registry 该对象类似于客户端用来嗅取服务器端的资源的观察者。 Serverend 上有什么全球物品? 的信息。服务器有许多全球对象 。类似Wl_compositor,wl_shm,等等。串在display->global_list链表里。全球目标和服务服务基本上相互关联。结果,服务器服务器承担了服务经理的职责。
wl_registry_add_listener(display->registry, ®istry_listener,...) // 让Client监听刚才创建的wl_registry代理对象。这样,当客户端引用 wl_ display_get_registry () 方法时, 或服务器端收到新的 Global 对象时,事件将通知客户。
wl_display_ jourtrip () / 等待服务器终端完成所有先前的请求时, 它 同步了 客户端和服务器端是指此函数。 返回 服务器届时应该有许多全球对象,回声处理方法登记簿_handle_global () 应该被调用数倍数, 当时应该有许多全球对象, 而回声处理方法登记簿_handle_global () 应该被调用数倍。
我猜是目前注册处的这个( handle_global) () 。 event 这篇文章是全球之声报导的一部分。然后,为了绑定,使用 wl_registry_bind () 。无法获取文件夹“%s”:%s这些代理类型包括 wl_shm、 wl_compositor等。尽管如此,它实际上还是一种 wl_proxy 类型。这个步骤的功能类似于 Android的装订服务将指派一个远程服务局当地代理。
2.创建窗口
window->surface = wl_compositor_create_surface()// 通过刚才绑定的wl_compositor服务创建Server端的weston_surface,代理 wl_ 地表被返回 。
xdg_shell_get_xdg_surface(..., window->surface, ...) // 通过刚才绑定的xdg_shell服务创建Server端的shell_surface,返回 xdg_表面代理。例如 wl_shell_地表。它的性能与xdg_表面类似。Xdg_地表是 wl_shell_地表的潜在替代物。然而,它尚未签署《韦德兰核心协定》。
窗口创建两个表面的目的是什么?因为Wayland协议预期服务器端将控制两层地面。比如说 Weston的例子合成器专门负责合成。 (c)与地表浮流器类似它主要看到Weston地表Weston 还将装入空壳模块( 如桌面外壳) 。 我不确定您在说什么, 所以..大部分代码都是在桌面外壳/外壳上锁定的。 (c)Inandroid 和Windows管理服务一样它主要观察贝壳表面。Shell_地表结构是Weston_地表的附加密封物。为了做窗口管理。这样, 合成渲染和窗口管理 这些单元可相互免费使用,导致较少程度的联结。
3. 分配缓冲和绘图
wl_ 地表_ 损坏 () // 信息合成器, 其区域不干净, 需要重新装修。 从整个窗口区域开始 。
重新绘制 () / / 然后使用重新绘制 () 开始绘制循环, 这是双重缓冲的软件 。
窗口_text_buffer () / / 获得一个绘图缓冲区 。
/ 如果缓冲区尚未指定,则使用先前约束的 wl_shm 服务来分配共享的内存。
fd = os_ create_anonomous_file () // 构建一个临时文件, 作为内存映射的备份文件, 以创建共享的内存generateos_ create_ anonymous_ file () // 构建一个临时文件, 作为内存映射的备份文件, 以创建共享的内存 。
mmap(..), fd,../ 将文件映射为 Clitend 结尾的内存 。
pool = wl_shm_create_pool (..), fd,../ 使用 wl_shm 服务构建共享的记忆库 。作为参数,通过 FD 。因此,服务器端可以使用此 fd 绘制与客户端相同的物理内存图。
buffer->buffer = wl_shm_pool_create_buffer(pool, ...) // 通过这个共享内存池在Server端分配buffer,wl_boffer 被返回为本地代理对象 。
wl_buffer_add_listener(buffer->buffer, &buffer_listener,...) // 监听这个buffer代理对象,当服务器端口使用此缓冲停止时,我会发出 释放事件。这样,该缓冲器可由客户重写到以下框架。
客户使用油漆像素()在缓冲上油漆其物品。
wl_oboth_attach ()/ / 将精心绘制的缓冲带 atatach 绘制到表面 。这和安卓的PupdateTeximage()方法相似。这是连接缓冲与表面的连接 。
wl_地表_损坏()// 通知服务器复合体的哪个部分是脏的, 需要重新绘制 。
window->callback = wl_surface_frame() // 在Server端创建Frame callback,它将被添加到表面的框架_ 回溯_ 列表列表中 。其代理服务器 wl_ 回召被退回 。
wl_callback_add_listener(window->callback, &frame_listener, ...) // 监听前面得到的callback代理对象。Serverendcompositor 完成合成文件后,这些回调对象将会完成事件( 参见 Weston_ output_ repaint () )。如果客户收到,他将在 wl_ recall_listner 中引用已完成的事件函数 。重新抽签方法见下文。这样,就形成了一个循环。
这篇文章是埃及2011年抗议活动特别报导的一部分。保证原子论,使地表财产变化的顺序变得无关紧要。这是一个具有地表服务器属性(损坏区域、输入区域、不透明的区域等等)的双缓冲(西边地表状态) 。因此,委员会前的修改现已在后备缓冲区。只有使用 wl_ forum_committee () 才能摆脱困境。这些改动才生效。
它和以前不一样 它和以前不一样 它和以前不一样 它和以前不一样在 SF 中, wl_ 表面与图层相对应。图形布ffer 使用 Wl_buffer 。Weston相当于SF+WMS。在表面从用户角度查看的窗口 。使 Clit 和 Server 同步运行,通常有许多缓冲带。它不同于安卓机器人的Android充当服务器,管理缓冲的生命周期。Clitend在韦兰完成了这一成就。
本文由 在线网速测试 整理编辑,转载请注明出处。