gpt4 book ai didi

C++套接字流api

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:36:10 28 4
gpt4 key购买 nike

我使用的是一个看起来非常不错的流式套接字 API,可以在此处找到: http://www.pcs.cnu.edu/~dgame/sockets/socketsC++/sockets.html .

我在访问已连接用户的 IP 时遇到问题,因为它是在另一个类“ServerSocket”中使用的类“Socket”的私有(private)成员。我的程序看起来与演示完全一样,只是它 fork 了进程。

// libraries
#include <signal.h>
#include <string>
#include <iostream>

// headers
#include "serversocket.hpp"
#include "socketexception.hpp"
#include "config.hpp"

using namespace std;

void sessionHandler( ServerSocket );


int main ( int argc, char** argv )
{
configClass config; // this object handles command line args
config.init( argc, argv ); // initialize config with args

pid_t childpid; // this will hold the child pid

signal(SIGCHLD, SIG_IGN); // this prevents zombie processes on *nix

try
{
ServerSocket server ( config.port ); // create the socket

cout << "server alive" << "\n";
cout << "listening on port: " << config.port << "\n";

while ( true )
{

ServerSocket new_client; // create socket stream
server.accept ( new_client ); // accept a connection to the server

switch ( childpid = fork() ) // fork the child process
{
case -1://error
cerr << "error spawning child" << "\n";
break;
case 0://in the child
sessionHandler( new_client ); // handle the new client
exit(0); // session ended normally
break;
default://in the server
cout << "child process spawned: " << childpid << "\n";
break;
}
}
}
catch ( SocketException& e ) // catch problem creating server socket
{
cerr << "error: " << e.description() << "\n";
}

return 0;
}


// function declarations

void sessionHandler( ServerSocket client )
{
try
{
while ( true )
{
string data;
client >> data;
client << data;
}
}
catch ( SocketException& e )
{
cerr << "error: " << e.description() << "\n";
}
}

所以我的问题是,我可以不访问当前连接到套接字的客户端的IP吗?如果必须针对该功能对其进行修改,最简洁的方法是什么?

感谢您的建议

我能够添加这两个函数,使我能够像这样仅从 main 的范围内获取 IP:

server.get_ip( new_client );但我真正想要的是像这样 new_client.ip();

这是我的 2 个函数,也许你可以进一步帮助我:

std::string Socket::get_ip( Socket& new_socket )
{
char cstr[INET_ADDRSTRLEN];
std::string str;
inet_ntop(AF_INET, &(m_addr.sin_addr), cstr, INET_ADDRSTRLEN);
str = cstr;
return str;
}

std::string ServerSocket::get_ip( ServerSocket& sock )
{
return Socket::get_ip( sock );
}

最佳答案

您正在使用的 Socket 类有一个私有(private)数据成员:

sockaddr_in m_addr;

这包含连接到套接字的客户端的信息。您可以通过以下方式获取人类可读的地址:

char str[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &(m_addr.sin_addr), str, INET_ADDRSTRLEN);

至于你需要做的改变,要么将m_addr公开(不推荐),要么根据上面的代码示例添加一个可以返回字符串的成员函数。

关于C++套接字流api,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4011745/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com