2011-01-03 6 views
0

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

+0

サーバー(1)に送信したデータがあり、(2)返されたデータで応答していることを確認できますか? – chrisaycock

+0

write関数は0を返すので、サーバーがデータを受け取ったとみなすことができ、サーバーは返されない読み取り関数に従って応答しません。 – kaykun

+0

'write'は書き込まれたバイト数を返します。したがって、ゼロが返されると、何も書き込まれなかったことが示されます。また、 'write'の戻り値の型は' int'ではなく 'ssize_t'ですが、それはあなたの問題ではありません。 –

答えて

1

を返す書き込み:

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

2番目のパラメータは効果的、構造およびコンピュータの意志をアンロール、ちょうどinit意志を渡し、&initする必要がありますたった3つの引数を見て

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

writeので、それはinitメンバーのいずれかを使用して次のようになります。このような何かを参照してください書き込むバッファのサイズとそのメンバーはおそらくゼロです。実際のバイトレベルの引数のスタックはコンパイラとアーキテクチャに依存しますので、あなた自身があなたのことをわくわくすることができます。重要なのは、あなたが望むものをwriteに与えていないということです。

あなたのコンパイラはこれをキャッチしていましたが、そうでなければ警告オプションを高くする必要があります。

Xサーバーに送信するデータをバイト単位でビルドしたい場合は、バイトオーダーとオフセットを正しく取得できるかどうかを確認することができます。 &initを送信すると、通常の容疑者(パッキング、アライメント、バイトオーダ)に問題が発生します。

+0

ありがとうございます、私は今、&initを渡すことによって少なくともいくつかの応答を得ています。 – kaykun

関連する問題