setsocketoptions L2CAP_OPTIONS завершается ошибкой с недопустимым аргументом

У меня есть код, в котором мне нужно создать сокет L2CAP, подключиться к устройству и установить для него mtu. Я получаю сообщение об ошибке "Недопустимый аргумент" при попытке сделать это. Создается сокет, делается привязка к одному bd_address и коннект тоже делается.

 sk = socket(PF_BLUETOOTH, SOCK_RAW, BTPROTO_L2CAP);
 if (sk < 0) 
 {
     perror("Can't create socket");
 }

 /* Bind to local address */
 memset(&addr, 0, sizeof(addr));
 addr.l2_family = AF_BLUETOOTH;
 str2ba(LOCAL_DEVICE_ADDRESS, &addr.l2_bdaddr);

 if (bind(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0)
 {
      perror("Can't bind socket");
 }

 /* Connect to remote device */
 memset(&addr, 0, sizeof(addr));
 addr.l2_family = AF_BLUETOOTH;
 str2ba(REMOTE_DEVICE_ADDRESS, &addr.l2_bdaddr);

 if (connect(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) 
 {
    perror("Can't connect");
 }
 perror("connected");

 if (getsockopt(sk, SOL_L2CAP, L2CAP_OPTIONS, &opts, sizeof(opts)) < 0)
 {
    perror("Can't get L2CAP MTU options");
    close(sk);
 }

 opts.imtu = 672; //this is default value
 opts.omtu = 672; //tried changing this too

if (setsockopt(sk, SOL_L2CAP, L2CAP_OPTIONS, &opts, sizeof(opts)) < 0) 
{
    perror("Can't set L2CAP MTU options");
    close(sk);
}

person dfordevy    schedule 20.07.2017    source источник
comment
Получение ошибки Невозможно установить параметры L2CAP MTU: неверный аргумент   -  person dfordevy    schedule 20.07.2017


Ответы (1)


Вы называете getsockopt неправильно. Последним аргументом должен быть указатель на soclen_t:

socklen_t optlen = sizeof(opts);
getsockopt(sk, SOL_L2CAP, L2CAP_OPTIONS, &opts, &optlen);

В вашем коде getsockopt обрабатывает sizeof(opts) как указатель (кстати, вы не получили предупреждение?), вызывая неопределенное поведение.

Кроме того, вы должны вызвать setsockopt с option, полученным getsockopt вызовом.

person user58697    schedule 20.07.2017
comment
Я сделал оба упомянутых изменения. Все еще получаю ту же ошибку. установить параметры L2CAP MTU: неверный аргумент. - person dfordevy; 21.07.2017
comment
Попробуйте протестировать optlen == sizeof(opts) после вызова getsockopt. Если они совпадают, мне понадобится ваше оборудование для дальнейшей отладки. - person user58697; 21.07.2017