Glx GlxQueryVersion返回“错误OpCode”的错误。 UNIX插座连接
使用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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论