gpt4 book ai didi

c++ - 为什么 addr 变量类型转换?

转载 作者:行者123 更新时间:2023-11-28 00:32:49 27 4
gpt4 key购买 nike

在网上冲浪时,我发现了一个发送 GET 请求的 C++ 示例。这段代码中我无法理解的部分是为什么(请参阅粗体部分)变量 addr 是类型转换的。我知道该函数只接受某种类型。但为什么要使用一种类型然后将其转换为另一种类型呢?

    #include <iostream>

#include <sys/socket.h>
#include <resolv.h>
#include <arpa/inet.h>

using namespace std;

int main()

{
int s, error;
struct sockaddr_in addr;

if((s = socket(AF_INET,SOCK_STREAM,0))<0)
{
cout<<"Error 01: creating socket failed!\n";
close(s);
return 1;
}

addr.sin_family = AF_INET;
addr.sin_port = htons(80);
inet_aton("204.27.61.92",&addr.sin_addr);

error = connect(s,(sockaddr*)&addr,sizeof(addr));

    if(error!=0)
{
cout<<"Error 02: conecting to server failed!\n";
close(s);
return 1;
}

char msg[] = "GET /beej/inet_ntoaman.html http/1.1\nHOST: retran.com\n\n";
char answ[1024];
//cin.getline(&msg[0],256);

send(s,msg,sizeof(msg),0);

while(recv(s,answ,1024,0)!=0)
cout<<answ<<endl;

close(s);
cin.getline(&msg[0],1);
return 0;
}

最佳答案

这是运行时多态性,C 风格。

sockaddr 实际上是一个抽象基类 - 它不特定于任何具体类型的套接字。但是,每种套接字类型都需要特定于类型的信息。

由于 C 语言不支持多态性,因此技术是编写一个“派生”类型,该类型将“基本”类型作为其第一个数据成员。这样它们就有了相同的地址,您可以在它们之间转换。

因此,(sockaddr*)&addr 是向上转型,产生指向有效基类子对象的指针。当您将其传递给 AF_INET 套接字时,它会将指针转换回 (sockaddr_in*) 并恢复您的特定于 inet 的数据。


供引用的等效 C++,因为它的表现力稍强:

class SockAddr {
public:
virtual ~SockAddr();
enum Family { INET, UNIX, ... };
Family get_family() const { return family; }
protected:
explicit SockAddr(Family f) : family(f) {}
Family family;
};

class SockAddrInet: public SockAddr {
uint16_t port;
uint32_t addr;
public:
SockAddrInet(uint16_t port, uint32_t addr)
: SockAddr(SockAddr::INET), port(htons(port)), addr(addr)
{}
};

class SockAddrUnix: public SockAddr {
std::string path;
public:
explicit SockAddrInet(std::string path)
: SockAddr(SockAddr::UNIX), path(path) {}
};

void connect(Socket &s, SockAddr const &addr) {
switch (addr.get_family()) {
case SockAddr::INET:
connect_inet(s, dynamic_cast<SockAddrInet const&>(addr));
break;
case SockAddr::UNIX:
connect_unix(s, dynamic_cast<SockAddrUnix const&>(addr));
break;
}
}

关于c++ - 为什么 addr 变量类型转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22149079/

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