C++ RCF 2.2.0.0 源码:如何检测新连接并获取IP地址和端口

在网络编程中,检测新的连接并获取连接的IP地址和端口号是非常常见的需求。本文将介绍如何使用C++和RCF 2.2.0.0 源码来实现这一功能,并提供一个简单易懂的示例代码。

使用 'select()' 函数检测新连接

'select()' 函数是Unix/Linux系统提供的一个强大的多路复用I/O机制,它可以用来同时监听多个文件描述符,并在其中任何一个文件描述符准备好进行I/O操作时返回。

在网络编程中,我们可以使用 'select()' 函数来监听套接字,并在有新的连接请求到达时通知程序。

获取IP地址和端口号

当 'select()' 函数通知我们有新的连接请求到达时,我们可以调用 'accept()' 函数来接受连接。'accept()' 函数会返回一个新的套接字,用于与客户端进行通信,同时还会填充一个 'sockaddr_in' 结构体,其中包含了客户端的IP地址和端口号。

示例代码

以下是一个简单的服务器程序,它使用 'select()' 函数来检测新的连接,并使用 'inet_ntoa()' 和 'ntohs()' 函数分别将IP地址和端口号转换为可读的字符串:

#include <iostream>
#include <string>
#include <cstring>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/select.h>

int main() {
    int serverSocket, clientSocket, maxfd, activity, i, valread, sd;
    struct sockaddr_in serverAddr, clientAddr;
    char buffer[1024];

    // 创建套接字
    serverSocket = socket(AF_INET, SOCK_STREAM, 0);
    if (serverSocket == -1) {
        std::cerr << 'Failed to create socket' << std::endl;
        return -1;
    }

    // 设置服务器套接字的属性
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_addr.s_addr = INADDR_ANY;
    serverAddr.sin_port = htons(8080);

    // 绑定套接字
    if (bind(serverSocket, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) < 0) {
        std::cerr << 'Failed to bind socket' << std::endl;
        return -1;
    }

    // 监听套接字
    if (listen(serverSocket, 5) < 0) {
        std::cerr << 'Failed to listen on socket' << std::endl;
        return -1;
    }

    // 设置非阻塞模式
    fcntl(serverSocket, F_SETFL, O_NONBLOCK);

    // 初始化文件描述符集合
    fd_set readfds;
    FD_ZERO(&readfds);
    FD_SET(serverSocket, &readfds);
    maxfd = serverSocket;

    while (true) {
        // 使用 select() 函数检测文件描述符集合中是否有可读数据
        activity = select(maxfd + 1, &readfds, nullptr, nullptr, nullptr);
        if (activity < 0) {
            std::cerr << 'Select error' << std::endl;
            return -1;
        }

        // 检查服务器套接字是否有新的连接
        if (FD_ISSET(serverSocket, &readfds)) {
            socklen_t addrLen = sizeof(clientAddr);
            clientSocket = accept(serverSocket, (struct sockaddr *)&clientAddr, &addrLen);
            if (clientSocket < 0) {
                std::cerr << 'Failed to accept new connection' << std::endl;
                return -1;
            }

            // 输出新连接的 IP 地址和端口号
            std::cout << 'New connection from ' << inet_ntoa(clientAddr.sin_addr) << ':' << ntohs(clientAddr.sin_port) << std::endl;

            // 将新的客户端套接字添加到文件描述符集合中
            FD_SET(clientSocket, &readfds);
            if (clientSocket > maxfd) {
                maxfd = clientSocket;
            }
        }

        // 检查所有客户端套接字是否有数据可读
        for (i = serverSocket + 1; i <= maxfd; i++) {
            if (FD_ISSET(i, &readfds)) {
                // 读取客户端发来的数据
                valread = read(i, buffer, sizeof(buffer));
                if (valread <= 0) {
                    // 客户端连接关闭或发生错误
                    close(i);
                    FD_CLR(i, &readfds);
                } else {
                    // 处理客户端发来的数据
                    buffer[valread] = '\0';
                    std::cout << 'Received data from client: ' << buffer << std::endl;
                }
            }
        }
    }

    return 0;
}

总结

本文介绍了如何使用C++和RCF 2.2.0.0 源码来检测新的连接并获取连接的IP地址和端口号。我们使用了 'select()' 函数来监听套接字,并在有新的连接请求到达时通知程序。然后,我们使用 'accept()' 函数来接受连接,并使用 'inet_ntoa()' 和 'ntohs()' 函数分别将IP地址和端口号转换为可读的字符串。

希望本文能够帮助您理解如何在C++网络编程中检测新的连接并获取连接的IP地址和端口号。

C++ RCF 2.2.0.0 源码:如何检测新连接并获取IP地址和端口

原文地址: https://www.cveoy.top/t/topic/eCc8 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录