3

データの配列をカーネル空間に送信したい(kextでコールバック関数を使用した)問題は、送信関数を使用すると、2つのシナリオで説明する奇妙なものが表示されることです:1)... char f [] = {'1'、 '2'、 '3'、 '4'、 '5'、 '6'}; send(sock、f、sizeof(f)、0); ええと、kextで受け取ったものをprintfすると:123456

2)... //f[2]を0に置き換えます

char f [] = {'1'、 '2'、0、 '4'、 '5'、 '6'}; send(sock、f、sizeof(f)、0);

しかし今回は、kextで受け取ったものをprintfすると:120000

send関数は最初の0バイト以降のすべてのバイトをゼロにするようですか?何が起こっている?これは送信機能のバグですか?私はxcode4.1を使用しましたが、私のOSはライオンです。ここはユーザースペースの部分です。

int main(int argc, char* const*argv)
{
    struct ctl_info ctl_info;
    struct sockaddr_ctl sc;
    char str[MAX_STRING_LEN];
    int sock = socket(PF_SYSTEM, SOCK_DGRAM, SYSPROTO_CONTROL);
    if (sock < 0)
        return -1;
    bzero(&ctl_info, sizeof(struct ctl_info));
    strcpy(ctl_info.ctl_name, "pana.ifmonitor.nke.foo");
    if (ioctl(sock, CTLIOCGINFO, &ctl_info) == -1)
        return -1;
    bzero(&sc, sizeof(struct sockaddr_ctl));
    sc.sc_len = sizeof(struct sockaddr_ctl);
    sc.sc_family = AF_SYSTEM;
    sc.ss_sysaddr = SYSPROTO_CONTROL;
    sc.sc_id = ctl_info.ctl_id;
    sc.sc_unit = 0;
    if (connect(sock, (struct sockaddr *)&sc, sizeof(struct sockaddr_ctl)))
        return -1;


     unsigned char data_send[]={'a','l','i','0','1','2','4','l','i',0,'1','2','4','l','i','0','1'};


    size_t data_recive;
    int j=0;
    char data_rcv[8192];


        send( sock, data_send, 17*sizeof(char), 10 );


        printf("\n");
        sleep(1);


        close(sock);
        return 0;

    }

これは、ユーザースペースデータの取得を担当するカーネルスペースコードの一部です。

errno_t EPHandleWrite(kern_ctl_ref ctlref, unsigned int unit, void *userdata,mbuf_t m, int flags)
{

    printf("\n EPHandleWrite called---------------------- \n");
    //char data_rec[50];

    //unsigned char *ptr = (unsigned char*)mbuf_data(m);
    //char ch;
    //mbuf_copydata(m, 0, 50, data_rec);

    //strncpy(&ch, ptr, 1 );


    size_t data_lenght;
    data_lenght = mbuf_pkthdr_len(m);

    char data_receive[data_lenght];
    strncpy( data_receive, ( char * ) mbuf_data(m) , data_lenght );

    printf("data recied %lu\n",data_lenght);

    for(int i=0;i<data_lenght;++i)
    {
        printf("%X ",data_receive[i]);
    }
 return 0
}

さて、それはコンソールで出力します:61 6C 69 30 31 32 34 6C 69 0 0 0 0 0 0 0 0そして私が送信データを次のように変更すると: {'a','l','i','0','1','2','4','l','i',**'0'**,'1','2','4','l','i','0','1'}; 私は正しくなります、実際私は送信データの最初のゼロバイトの後にすべて0を取得します

4

1 に答える 1

1

問題はstrncpy行です。のドキュメントを見るとstrncpy、0バイトに達するまでしかコピーされないため、C文字列の処理にのみ適していることがわかります。任意のバイナリデータをコピーする必要がある場合は、memcpyを使用してください。

于 2012-09-10T11:47:16.107 に答える