2017-07-20 11 views
0

私はL2CAPソケットを作成し、デバイスに接続し、同じものにmtuを設定する必要があるコードを持っています。そうしようとすると「無効な引数」というエラーが表示されます。ソケットが作成され、バインドが1つのbd_addressに対して行われ、connectも実行されます。setsocketoptions L2CAP_OPTIONSが "無効な引数エラー"で失敗する

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); 
} 
+0

「L2CAP MTUオプションを設定できません:無効な引数」 – dfordevy

答えて

0

getsockoptを間違って呼び出した場合。あなたのコードでは、未定義の動作を引き起こしポインタ(ところで、あなたは警告を取得していない?)、などgetsockopt扱いsizeof(opts)

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

:最後の引数はsoclen_tへのポインタでなければなりません。

optionと呼び出すと、getsockoptが呼び出される必要があります。

+0

私は両方の変更を行いました。まだ同じエラーが発生しています。 L2CAP MTUオプションを設定します。無効な引数です。 – dfordevy

+0

'optlen == sizeof(opts)' _after_ 'getsockopt'の呼び出しを試してみてください。一致すれば、ハードウェアをさらにデバッグする必要があります。 – user58697

関連する問題