qt4中QTcpServer问题

alucardpj 2009-02-27 11:25:21
QT4中怎样监控本地socket?我想让QT程序和蓝牙协议栈BlueZ结合,QT端开启一个listening server socket,然后赋给QTcpServer,监听newConnection消息,在相应的槽里accept新的连接,但是accept返回总是失败,是不是因为已经被蓝牙协议栈底层accept了然后没得到相应的client socket?或者有没有做过相应的监控本地socket的?进程间socket的也可以。参考一下,谢谢。
...全文
778 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
alucardpj 2009-03-02
  • 打赏
  • 举报
回复
已解决,QTcpServer会自行accept incoming connection,不需要再accept,继承一下QTcpServer,重写incomingConnection函数,捕捉新连接的socket,新连接建立起来以后会回调该接口。
Bestrem_9 2009-03-01
  • 打赏
  • 举报
回复
关注!!!
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 alucardpj 的回复:]
qt4文档中的说法
void QTcpServer::newConnection () [signal]

This signal is emitted every time a new connection is available.

那是newConnection已经建立了才出这个消息还是说有连接来了就出?
[/Quote]
哦,原来这个signal是QT库提供的,那就是每次有新的connect,QT4会自动emit这个signal,不需要你操心。
  • 打赏
  • 举报
回复
QT4端accept失败?发代码来看看。
要不你直接用linux socket代码来写。
alucardpj 2009-02-27
  • 打赏
  • 举报
回复
qt4文档中的说法
void QTcpServer::newConnection () [signal]

This signal is emitted every time a new connection is available.

那是newConnection已经建立了才出这个消息还是说有连接来了就出?
  • 打赏
  • 举报
回复
newConnection(),这个signal在哪里emit?
alucardpj 2009-02-27
  • 打赏
  • 举报
回复
void create_main_port()
{
int fd;
struct hci_dev_info info;
//struct sockaddr_rc rfcomm;
//struct sockaddr_rc hfp_rfcomm;

if ((fd = socket(PF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM)) < 0) {
fprintf(stderr, "create the rfcomm socket fail: %s (%d)\n",
strerror(errno), errno);
return;
}
hci_devinfo(0, &info);

memset(&hfp_rfcomm, 0, sizeof(hfp_rfcomm));
hfp_rfcomm.rc_family = AF_BLUETOOTH;
bacpy(&hfp_rfcomm.rc_bdaddr, &info.bdaddr);
hfp_rfcomm.rc_channel = 8; //RFCOMM_CHAN_HFP

if (::bind(fd, (struct sockaddr *)&hfp_rfcomm, sizeof(hfp_rfcomm)) < 0) {
fprintf(stderr, "bind to rfcomm socket fail: %s (%d)\n",
strerror(errno), errno);
::close(fd);
return;
}

if (::listen(fd, 1))
{
::close(fd);
return;
}

main_port_server = new QTcpServer();
main_port_server->setSocketDescriptor(fd);
}

QObject::connect(main_port_server, SIGNAL(newConnection()), this, SLOT(main_port_accept()));

void main_port_accept()
{
printf("new connection\n");
int fd;
socklen_t addrlen = sizeof(struct sockaddr_rc);

fd = ::accept(main_port_server->socketDescriptor(), (struct sockaddr *) &hfp_rfcomm, &addrlen);
}

client可以连接上来,并触发main_port_accept,但是这里fd返回始终是-1,提示资源临时不可用,查看蓝牙的trace信息发现连接已经accept了,是捕捉的signal不合适还是什么其他原因?

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧