C++ RCF 2.2.0.0 源码:如何检测新连接并获取IP地址和端口
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地址和端口号。
原文地址: https://www.cveoy.top/t/topic/eCc8 著作权归作者所有。请勿转载和采集!