2017-07-20 45 views
0

我有一个代码,我需要创建一个L2CAP套接字,连接到一个设备并设置相同的MTU。试图这样做时,我收到错误“无效参数”。套接字被创建,绑定完成到一个bd_address并且连接也完成。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。最后一个参数应是指向soclen_t

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

在你的代码getsockopt对待sizeof(opts)为指针(顺便说一句,你没得到一个警告?),导致未定义的行为。

此外,您必须致电setsockoptoption获得通过getsockopt致电。

+0

我做了上述两项更改。仍然得到相同的错误。设置L2CAP MTU选项:无效参数。 – dfordevy

+0

尝试在'getsockopt'调用之后测试'optlen == sizeof(opts)'__。如果他们匹配,我需要你的硬件进一步调试。 – user58697

相关问题