Xウィンドウシステムプロトコルのドキュメントを使用して、XlibまたはXCBを使用しないローカルXサーバに接続する独自のプログラムを作成しようとしています。接続データをサーバーソケットに書き込んだ後は、読み取り機能がブロックするので、サーバーの応答を読み取ることができません。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;
}
私のコードには何が欠けていますか?接続および機能は、私はあなたの問題はあなたのwrite
であることを疑う0
サーバー(1)に送信したデータがあり、(2)返されたデータで応答していることを確認できますか? – chrisaycock
write関数は0を返すので、サーバーがデータを受け取ったとみなすことができ、サーバーは返されない読み取り関数に従って応答しません。 – kaykun
'write'は書き込まれたバイト数を返します。したがって、ゼロが返されると、何も書き込まれなかったことが示されます。また、 'write'の戻り値の型は' int'ではなく 'ssize_t'ですが、それはあなたの問題ではありません。 –