2017-07-20 47 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

相關問題