Glx GlxQueryVersion返回“错误OpCode”的错误。 UNIX插座连接

发布于 2025-01-22 15:39:57 字数 1552 浏览 4 评论 0原文

使用UNIX插座完成X服务器的连接。我可以确认服务器具有GLX带有以下代码的扩展:

  const char *str_extension = "GLX";
/* X protocol requires requests to be in 4 byte units */
  ssize_t     len       = ((strlen(str_extension + 1) + 3) & ~3; 
  char        pad_str_extension[3 + l];
  rq_q_extension_t  rq = {
   .opcode = X11_OPCODE_QUERY_EXTENSION,
   .len    = 2 + len / 4,
   .len_nm = strlen(str_extension),
  };

  memcpy(pad_str_extension, str_extension, strlen(str_extension));

  rp_q_extension_t  rp;

  if(write(fd, &rq, sizeof(rq)) < (ssize_t)sizeof(rq))
   ERROR;
  if(write(fd, cbf, 3 + l) < (3 + l))
   ERROR;
  if(read(fd, &rp, sizeof(rp)) < (ssize_t)sizeof(rp))
   ERROR;
  printf("GLX present   : %u\n", rp.present);
  printf("\tmajor_code  : %u\n", rp.major_code);
  printf("\tfirst_event : %u\n", rp.first_event);
  printf("\tfirst_error : %u\n", rp.first_error);

上述输出显示扩展名,并且具有1.4版本。 我的问题是下一个请求失败

  rq_gxl_q_version_t  rq = {
   .opcode_x11 = glx_base_opcode,
   .opcode_glx = X11_OPCODE_GLX_QUERYVERSION,
   .len        = sizeof(rq_gxl_q_version_t) / 4,
   .major_version = 1,
   .m1nor_version = 4,
  };
  rp_glx_q_version_t rp;

  if(write(fd, &rq, sizeof(rq)) < (ssize_t)sizeof(rq))
   ERROR;
  if(read(fd, &rp, sizeof(rp)) < (ssize_t)sizeof(rp))
   ERROR;

  /* status is zero here */
  if(!rp.status){
   x11_rp_error_t* e_rp = (x11_rp_error_t*)&rp;

此请求以“错误的OPCODE”错误代码失败。我花了几天的时间调查失败,但仍然找不到它。

The connection to the X server is done with Unix sockets. I can confirm that the server has GLX extension with the following code:

  const char *str_extension = "GLX";
/* X protocol requires requests to be in 4 byte units */
  ssize_t     len       = ((strlen(str_extension + 1) + 3) & ~3; 
  char        pad_str_extension[3 + l];
  rq_q_extension_t  rq = {
   .opcode = X11_OPCODE_QUERY_EXTENSION,
   .len    = 2 + len / 4,
   .len_nm = strlen(str_extension),
  };

  memcpy(pad_str_extension, str_extension, strlen(str_extension));

  rp_q_extension_t  rp;

  if(write(fd, &rq, sizeof(rq)) < (ssize_t)sizeof(rq))
   ERROR;
  if(write(fd, cbf, 3 + l) < (3 + l))
   ERROR;
  if(read(fd, &rp, sizeof(rp)) < (ssize_t)sizeof(rp))
   ERROR;
  printf("GLX present   : %u\n", rp.present);
  printf("\tmajor_code  : %u\n", rp.major_code);
  printf("\tfirst_event : %u\n", rp.first_event);
  printf("\tfirst_error : %u\n", rp.first_error);

The above outputs that extension is present and has 1.4 version. My problem is that the next request fails.

  rq_gxl_q_version_t  rq = {
   .opcode_x11 = glx_base_opcode,
   .opcode_glx = X11_OPCODE_GLX_QUERYVERSION,
   .len        = sizeof(rq_gxl_q_version_t) / 4,
   .major_version = 1,
   .m1nor_version = 4,
  };
  rp_glx_q_version_t rp;

  if(write(fd, &rq, sizeof(rq)) < (ssize_t)sizeof(rq))
   ERROR;
  if(read(fd, &rp, sizeof(rp)) < (ssize_t)sizeof(rp))
   ERROR;

  /* status is zero here */
  if(!rp.status){
   x11_rp_error_t* e_rp = (x11_rp_error_t*)&rp;

This request fails with the "wrong opcode" error code. I've spend few days investigating the failure, still can't find a cuse of it.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文