Связь с ядром
Я хочу отправить массив данных в пространство ядра (я использовал функцию обратного вызова в моем kext). Проблема в том, что когда я использую функцию send, я вижу что-то странное, что я объясняю в сценарии 2: 1) ... char f[]={'1','2','3','4','5','6'}; отправить (носок,f,sizeof(f),0); хорошо, когда я печатаю то, что я получаю в kext: 123456
2)... // я заменяю f[2] на 0
char f [] = {'1', '2',0, '4', '5', '6'}; отправить (носок,f,sizeof(f),0);
но на этот раз, когда я печатаю то, что я получаю в kext: 120000
кажется, что функция отправки обнуляет каждый байт после первого 0 байт? что здесь происходит? это ошибка функции отправки? Я использовал XCode 4.1, и я моя ОС лев здесь часть пользовательского пространства:
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 после первого нулевого байта в данных отправки
1 ответ
Проблема заключается в strncpy
линия - если вы посмотрите на документацию для strncpy
вы заметите, что он копирует только до 0 байт, поэтому он подходит только для работы со строками Си. Если вам нужно скопировать произвольные двоичные данные, используйте memcpy.