【问题标题】:Connecting to X Server连接到 X 服务器
【发布时间】:2011-01-03 03:02:32
【问题描述】:

我正在尝试使用 X Window 系统协议文档编写自己的程序,该程序连接到不使用 Xlib 或 XCB 的本地 X 服务器。将连接数据写入服务器套接字后,由于读取功能阻塞,我似乎无法回读服务器的回复。

#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdio.h>
#include <string.h>
#include <stdint.h>

int main()
{
  int sockfd = socket(AF_UNIX, SOCK_STREAM, 0);

  struct sockaddr_un serv_addr;
  memset((void*)&serv_addr, 0, sizeof(serv_addr));
  serv_addr.sun_family = AF_UNIX;
  strcpy(serv_addr.sun_path, "/tmp/.X11-unix/X0");
  int servlen = 17 + sizeof(serv_addr.sun_family);

  int err = connect(sockfd, (struct sockaddr*)&serv_addr, servlen);

  printf("%d\n", err);

  struct
  {
    uint8_t en;
    uint8_t pad;
    uint16_t major;
    uint16_t minor;
    uint16_t name_len;
    uint16_t data_len;
    uint16_t pad2;
    uint8_t name[4];
    uint8_t data[4];
  } init;

  init.en = 'l';
  init.major = 11;
  init.minor = 0;
  init.name_len = 0;
  init.data_len = 0;

  err = write(sockfd, init, sizeof(init));

  printf("%d\n", err);

  uint8_t buf[5000];

  int n = read(sockfd, buf, 5000);

  return 0;
}

我的代码中缺少什么?连接和写入函数返回 0。

【问题讨论】:

  • 您能否确认服务器 (1) 收到了您发送给它的数据,并且 (2) 正在响应您期望返回的数据?
  • 写函数返回0所以我猜可以假设服务器收到了数据,根据读函数没有返回,服务器根本没有响应。
  • write 返回写入的字节数,因此返回零表示根本没有写入任何内容。此外,write 的返回类型是 ssize_t 而不是 int,但这不是你的问题。
  • 我犯了一个愚蠢的错误,write 函数最初返回 -1,这就是为什么我可能会将 0 与成功混淆。

标签: c xorg xserver


【解决方案1】:

我怀疑你的问题出在你的write:

err = write(sockfd, init, sizeof(init));

第二个参数应该是&amp;init,只传递init 将有效地展开结构并且计算机将看到如下内容:

err = write(sockfd, init.en, init.pad, ..., sizeof(init));

由于write 只查看三个参数,它将使用init 成员之一作为要写入的缓冲区的大小,并且该成员可能为零。实际的字节级参数堆栈取决于编译器和架构,因此您可以自己取笑,重要的是您没有提供 write 您想要的内容。

您的编译器应该已经捕捉到这一点,如果没有,那么您需要将警告选项调到尽可能高。

无论如何,您可能希望逐字节构建发送到 X 服务器的数据,这样您就可以确保获得正确的字节顺序和偏移量。发送&amp;init 会让您遇到常见的问题(打包、对齐和字节顺序)。

【讨论】:

  • 谢谢,我现在通过 &init 至少得到了一些响应。
猜你喜欢
  • 1970-01-01
  • 2019-04-20
  • 2012-03-25
  • 1970-01-01
  • 1970-01-01
  • 2019-12-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多