c++ - *nix & C++ 编写非阻塞套接字服务器

标签 c++ sockets unix binding posix-select

我在将阻塞套接字服务器重写为非阻塞版本时遇到了一些问题。 实际上,我似乎再也无法连接套接字了,我今天大部分时间都在谷歌搜索,并尝试在这里和那里找到不同的解决方案,但它们似乎都无法正常工作...... 目前我的服务器循环只是让 select() 调用超时,没有接受新的套接字。 客户端套接字似乎在某种程度上连接,因为如果我启动它,它会阻止尝试写入,如果我关闭服务器,它会通知连接已被对等方重置。

以下假设是否正确? 对于非阻塞服务器,我通常应该打开套接字,然后将其标志设置为非阻塞,绑定(bind)它,然后开始调用 select 以读取文件描述符并等待它填充? 我需要删除旧的阻塞“accept()”调用,它一直在等待...... 如果我尝试调用 accept,它现在会在我身上显示 -1...

这是我现在正在尝试的相关代码

fd_set incoming_sockets;
....
int listener_socket, newsockfd, portno;
socklen_t clilen;
struct sockaddr_in serv_addr, cli_addr;
....
listener_socket = socket(AF_INET, SOCK_STREAM, 0); //get socket handle
int flags = fcntl(listener_socket, F_GETFL, 0);
if( fcntl(listener_socket, F_SETFL, flags | O_NONBLOCK) < 0 )
    log_writer->write_to_error_log("Error setting listening socket to non blocking", false);
memset(&serv_addr, 0, sizeof(struct sockaddr_in));

serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portno);
....
if (bind(listener_socket, (struct sockaddr *) &serv_addr,
        sizeof(struct sockaddr_in)) < 0)
{
    log_writer->write_to_error_log("Unable to bind socket, aborting!", true);
}
....
struct timeval timeout;
timeout.tv_sec = 1;
timeout.tv_usec = 0;

int ready_sockets = 0;

listen(listener_socket,1);

FD_ZERO(&incoming_sockets); 
FD_SET(listener_socket, &incoming_sockets); 

while(true)
{

ready_sockets = select(listener_socket + 1 , &incoming_sockets, (fd_set * ) 0, (fd_set * ) 0, &timeout  );

if(ready_sockets == 0)
    {
        //I loop here now for ever
        std::cout << "no new sockets available, snooze 2\n";
        sleep(2);
    } else
    {
    std::cout << "connection received!\n";

最佳答案

由于您没有显示整个循环,我不知道您以后是否这样做,但您应该在每次调用 select 之前初始化描述符集和超时结构。

关于c++ - *nix & C++ 编写非阻塞套接字服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8892092/

相关文章:

php - Unix 时间戳和 mysql 日期 : birthdate

c++ - GNU make 一种双冒号

c++ - 海湾合作委员会 5.2.1 _GLIBCXX_USE_CXX11_ABI

c - Socket C 同时处理 recv() 和 send()

macos - 如何在ASyncSocket中检测远程断开连接

java - 使用正则表达式或unix选择特定列

linux - 如何可靠地跟踪 POSIX 系统上的子/孙进程?

c++ - 使用 64 位分子和分母对 pi 的最佳有理近似值是多少?

c++ - 解析 Google Protocol Buffer 的文本文件

node.js - socket.io 强制断开客户端