- "[gatt_run:383]: Failed to add listen socket(11),error(-38)"该行错误打印,提示的源代码如下:
```ret = mainloop_add_fd(fd, EPOLLIN, server_listen_cb, server, NULL);
if (ret < 0) {
BTMG_ERROR("Failed to add listen socket(%d),error(%d)n",fd,ret);
close(fd);
netcfg_state = 0;
return NULL;
}
从上可以判断是调用了mainloop_add_fd函数异常,该函数是链接的开源bluez协议栈中的库,于是搜索了bluez中关于mainloop_add_fd的实现,发现实现该函数有有三处地方,分别是(1)src/shared/mainloop-ell.c:编入到src/.libs/libshared-ell.a库中。int mainloop_add_fd(int fd, uint32_t events, mainloop_event_func callback,
void *user_data, mainloop_destroy_func destroy)
{
return -ENOSYS;
}
(2)src/shared/mainloop-glib.c:编入到src/.libs/libshared-glib.a库中。int mainloop_add_fd(int fd, uint32_t events, mainloop_event_func callback,
void *user_data, mainloop_destroy_func destroy)
{
return -ENOSYS;
}
(3) src/shared/mainloop.c:编入到src/.libs/libshared-mainloop.a库中。int mainloop_add_fd(int fd, uint32_t events, mainloop_event_func callback,
void *user_data, mainloop_destroy_func destroy)
{
struct mainloop_data *data;
struct epoll_event ev;
int err;
if (fd < 0 || fd > MAX_MAINLOOP_ENTRIES - 1 || !callback)
return -EINVAL;
data = malloc(sizeof(*data));
if (!data)
return -ENOMEM;
memset(data, 0, sizeof(*data));
data->fd = fd;
data->events = events;
data->callback = callback;
data->destroy = destroy;
data->user_data = user_data;
memset(&ev, 0, sizeof(ev));
ev.events = events;
ev.data.ptr = data;
err = epoll_ctl(epoll_fd, EPOLL_CTL_ADD, data->fd, &ev);
if (err < 0) {
free(data);
return err;
}
mainloop_list[fd] = data;
return 0;
}
而 Failed to add listen socket(11),error(-38)提示-38正好是"-ENOSYS", 在errno.h中有定义#define ENOSYS 38 /* Function not implemented */
所以排查到是链接的函数不对,应用程序中同时链接了libshared-glib.a和libshared-mainloop.a,最后取用的是libshared-glib.a,应该使用的是libshared-mainloop.a。在使用mainloop_add_fd函数的时候,要尤其注意,要链接使用正确的库。使用libshared-mainloop.a而不是libshared-glib.a和libshared-ell.a。
|
|
2021-12-29 10:11:43
评论
举报
|
|
|