qt select网络通讯
时间: 2025-03-27 14:30:36 浏览: 29
### Qt 使用 `select` 进行网络通信
在Qt框架中,虽然更推荐使用信号槽机制以及高级别的类如 `QTcpSocket` 或者 `QUdpSocket` 来处理网络编程,但也可以通过底层接口实现基于 `select` 的多路复用I/O模型来管理多个套接字。对于希望深入理解操作系统层面操作的应用开发者来说,这种方式提供了更大的灵活性。
下面是一个简单的例子展示如何利用POSIX标准下的 `select` 函数配合Qt来进行非阻塞式的TCP服务器端程序开发:
```cpp
#include <QCoreApplication>
#include <QDebug>
#include <sys/select.h>
#include <unistd.h> // For close()
#include <arpa/inet.h>
class SelectServer : public QObject {
Q_OBJECT
public slots:
void start() {
int sockfd, newsockfd;
struct sockaddr_in serv_addr;
char buffer[256];
fd_set readfds;
/* 创建socket */
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) perror("ERROR opening socket");
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(8080);
/* 绑定地址到创建的socket上 */
if (bind(sockfd, (struct sockaddr *) &serv_addr,
sizeof(serv_addr)) < 0)
perror("ERROR on binding");
listen(sockfd,5);
while(true){
FD_ZERO(&readfds);
FD_SET(sockfd,&readfds);
// Wait for incoming connections or data from existing ones.
select(sockfd + 1, &readfds, NULL, NULL, NULL);
if(FD_ISSET(sockfd,&readfds)){
socklen_t clilen = sizeof(struct sockaddr_in);
newsockfd = accept(sockfd,(struct sockaddr *)&serv_addr,&clilen);
if(newsockfd >= 0){
qDebug()<<"Connection accepted.";
// Read message here...
memset(buffer,'\0',sizeof(buffer));
ssize_t n = read(newsockfd,buffer,sizeof(buffer)-1);
if(n > 0){
qDebug()<<QString::fromUtf8(buffer,n);
}
close(newsockfd);
}else{
perror("accept failed.");
}
}
}
close(sockfd);
}
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
SelectServer server;
QTimer::singleShot(0, &server,SLOT(start()));
return a.exec();
}
```
此代码片段展示了怎样设置并监听一个TCP服务端口,并采用 `select()` 方法等待客户端连接请求的到来或是已建立连接上的数据到来事件。一旦有新的连接被接受,则尝试读取来自该连接的数据并将之打印出来[^3]。
需要注意的是,在实际项目里通常不会直接这样写,而是应该考虑线程安全性和错误恢复等问题;而且大多数时候可以直接依赖于更高层次抽象好的APIs比如 `QTcpServer` 和 `QTcpSocket` 类完成相同的工作而无需自己去操心这些细节。
#### 文档资源链接
官方文档提供了详细的说明和更多复杂的案例供进一步研究:
- [Qt Network Module](https://doc.qt.io/qtforpython/overviews/network-programming.html)
阅读全文
相关推荐


















