setsocketoptions L2CAP_OPTIONS 因“无效参数错误”而失败

Posted

技术标签:

【中文标题】setsocketoptions L2CAP_OPTIONS 因“无效参数错误”而失败【英文标题】:setsocketoptions L2CAP_OPTIONS fails with "Invalid argument error" 【发布时间】:2017-12-26 02:23:53 【问题描述】:

我有一个代码,我需要在其中创建 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);

【问题讨论】:

收到错误“无法设置 L2CAP MTU 选项:无效参数” 【参考方案1】:

您错误地调用了getsockopt。最后一个参数是指向soclen_t的指针:

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

在您的代码中 getsockoptsizeof(opts) 视为指针(顺便说一句,您没有收到警告吗?),导致未定义的行为。

另外,您必须使用option 调用getsockopt 获得的setsockopt

【讨论】:

我做了提到的两个改变。仍然得到同样的错误。设置 L2CAP MTU 选项:参数无效。 尝试测试optlen == sizeof(opts)调用getsockopt。如果它们匹配,我需要您的硬件进一步调试。

以上是关于setsocketoptions L2CAP_OPTIONS 因“无效参数错误”而失败的主要内容,如果未能解决你的问题,请参考以下文章

setsocketoptions L2CAP_OPTIONS 因“无效参数错误”而失败

TCP/IP 插口选项

c# socket 通信时如何限速?

请教高手:SocketAsyncEventArgs 类服务端如何设置心跳超时

Linux socket编程 套接字选项

php socket函数socket_set_option怎么用?