Подключение к X-серверу - PullRequest
       24

Подключение к X-серверу

0 голосов
/ 03 января 2011

Я пытаюсь написать свою собственную программу, которая подключается к локальному X-серверу, который не использует Xlib или XCB, используя документацию X Window System Protocol. После записи данных соединения в сокет сервера я не могу прочитать ответ сервера, так как функциональные блоки чтения.

#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 Ответ

1 голос
/ 03 января 2011

Я подозреваю, что ваша проблема связана с вашим write:

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

Второй параметр должен быть &init, передача только init будет эффективно развернуть структуру, и компьютер увидитчто-то вроде этого:

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

Поскольку write рассматривает только три аргумента, он будет использовать один из элементов init в качестве размера буфера для записи, и этот член, вероятно, равен нулю.Фактический стек аргументов на уровне байтов зависит от компилятора и архитектуры, поэтому вы сами можете дразнить, что вы сами, главное, чтобы вы не выдавали write того, что хотите.

Ваш компилятор должен был перехватитьэто, если этого не произошло, вам нужно развернуть опции предупреждений так высоко, как они будут идти.

Возможно, вы все равно захотите собрать данные, которые вы отправляете на байт байта X-сервера, чтобыТаким образом, вы можете убедиться, что вы правильно поняли порядок байтов и смещения.Отправка &init доставит вам неприятности с обычными подозреваемыми (упаковка, выравнивание и порядок байтов).

...