*nix & C++ 编写非阻塞套接字服务器
*nix & C++ writing a non-blocking socket server
我在将阻塞套接字服务器重写为非阻塞版本时遇到一些问题。事实上,我似乎连插座都接不上了,今天大部分时间我都在谷歌上搜索,并尝试了不同的解决方案,但似乎都无法正常工作。。。目前,我的服务器循环只是使select()调用超时,不接受新的套接字。客户端套接字似乎在某种程度上是连接的,因为如果我启动它,它将阻止尝试写入,如果我关闭服务器,它将通知对等方重置了连接。
以下假设正确吗?对于非阻塞服务器,我通常应该打开套接字,然后将其标志设置为非阻塞,绑定它,然后开始调用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 2n";
sleep(2);
} else
{
std::cout << "connection received!n";
由于您没有显示整个循环,我不知道您以后是否会这样做,但您应该在每次调用select
之前初始化描述符集和超时结构。
您应该在循环内移动fd_zero()fd_set()宏,select将实际更改fd_set中的位掩码(和超时值)。在每次迭代中重新初始化它们。同时检查选择返回-1和相关的错误号(EPIPE…)
while(true)
{
FD_ZERO(&incoming_sockets);
FD_SET(listener_socket, &incoming_sockets);
ready_sockets = select(listener_socket + 1 , &incoming_sockets, (fd_set * ) 0, (fd_set * ) 0, &timeout );
if(ready_sockets == 0)
{
... }
相关文章:
- Boost-Beast 异步 Web 套接字 服务器-客户端异步读写 不在控制台上写入输出
- C 套接字服务器不接受任何客户端 /客户端无法连接
- Datagram套接字服务器未从客户端接收消息
- 了解Apache Thrift与TCP套接字服务器的特征
- 客户端JavaScript和C 套接字服务器之间的通信
- 使用 gtkmm3 的套接字服务器
- C :接收Sigkill时如何关闭TCP套接字(服务器)
- 将当前套接字服务器设计适应SSL(C ,GSK,SPAWNP())
- Linux 上的 C/C++ 中的简单原始套接字服务器
- C/C++TCP套接字服务器读取
- C++套接字服务器体系结构
- 将套接字服务器从 Node.js 移植到 C#
- tcp套接字服务器未发送
- 组织C++套接字服务器的最佳方式是什么
- C++套接字服务器到 Flash/Adobe AIR
- 如何通过套接字C++服务器/Java客户端发送int
- 具有多个客户端的套接字服务器.杀死子进程
- UNIX域套接字C++服务器无法将数据返回到客户端
- *nix & C++ 编写非阻塞套接字服务器
- 使套接字服务器接受多个客户端