- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我遇到了一个套接字编程教程,其中引用了它
"a pointer to a struct sockaddr_in can be cast to a pointer to a struct sockaddr and vice-versa"
我不明白如何将 sockaddr_in 强制转换为 sockaddr。将 Big 类型的指针转换为 Small 类型应该给出 UD 行为。
struct sockaddr {
unsigned short sa_family; // address family, AF_xxx
char sa_data[14]; // 14 bytes of protocol address
};
struct sockaddr_in {
short int sin_family; // Address family, AF_INET
unsigned short int sin_port; // Port number
struct in_addr sin_addr; // Internet address
unsigned char sin_zero[8]; // Same size as struct sockaddr
};
强制转换如何不被定义?将它们相互转换不是不安全吗?
如果我有一个只有两个整数的 A 类和有 4 个整数的 B 类。如果我有一个 B 类型的指针并将其转换为 A 类型,那么我肯定可以获取前两个元素。但是,如果 A 类首先声明了 2 个字符,然后声明了 2 个整数,那么指针将无法正确获取值,因为在这种情况下对象布局会有所不同。
编辑 1:
class Anu
{
public:
char a;
int b;
Anu()
{
a='a';
}
};
class Anurag
{
public:
Anurag() { a=4;}
int a;
int b;
int c;
int d;
};
int main()
{
Anu objanu;
Anurag objanurag;
Anurag *ptrAnurag= &objanurag;
ptrAnurag= (Anurag*)&objanu;
cout<<ptrAnurag->a; //Some weird value here
return 0;
}
假设我更改了示例,以便通过调整变量类型使两个类具有相同的大小......即使大小保持不变,对象布局仍然可能不同。
最佳答案
我将通过说未定义的行为并不总是意味着坏事即将发生来补充@gsamaras 的回答。未定义的行为实际上是说“我们*不提供任何关于如果 XYZ 发生接下来应该发生什么的规范”。
(*C++ 标准)。
这是操作系统发生的地方,并说“它由我们定义”。
尽管转换不相关的结构(sockaddr_in
、sockaddr
)可能是标准未定义的行为,但 OS API 指定它对其 API 有效。
关于c++ - 在 sockaddr 指针和 sockaddr_in 指针之间转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33319224/
因此,我试图读取二进制文件,其中字节以网络字节顺序排列。在文件中,它们包含为套接字编程创建结构sockaddr_in所需的信息。这些文件的排列方式是,前4个字节代表IPv4地址,后2个字节代表端口号(
我想做一个小型的ECHO服务器,但是这段代码在通过sendto时一直返回-1,我不知道为什么。 它总是传递到 perror 并打印地址族不支持谁能解释一下为什么? 这是我的代码: sock = soc
我现在正在用 C 语言创建一个服务器/客户端系统,我在客户端部分遇到了一些麻烦。据我所知,我需要使用 sockaddr_in 才能连接到服务器。但是,我每次都遇到段错误。我相信 sockaddr_in
我正在解决一些静态分析缺陷,而导致我出现问题的就是这个缺陷。 SOCKADDR_IN m_stLclAddr; SOCKADDR_IN is a member of the WinSock API 缺
我有一段代码,很久以前在某个环境下工作过。我很确定它是一台 FreeBSD 机器,所以我得到了 FreeBSD 8.3,我正在尝试制作这个文件,但它不工作。 当我尝试编译它时,它会提示: f.c: I
我正在遵循 beej 的网络指南,它进展得非常好,因为我对所有内容都非常了解,而且他解释得很好。但是,当我想测试他向我展示的一些很酷的东西时,它不会起作用! :( 我不确定 sockaddr_in 到
这是 netinet/in.h 中定义的 internet(IPv4) 套接字地址结构 struct sockaddr_in { uint8_t sin_len; s
作为接收struct ifreq *ifr参数的函数的一部分,如果我声明struct sockaddr_in name;,程序会编译,但如果我命名变量struct sockaddr_in ifr_ad
我正在创建一个小型的发送方和接收方应用程序,它将其名称广播到多播组中的所有其他应用程序,同时还接收其他应用程序的名称。 我想我现在已经完成了发送部分,如下所示: if (sendto(sock, me
目前我正在构建一个点对点网络架构,并且正处于创建一个接收函数的阶段,该函数将接受来自网络上多个客户端的消息。本质上,当 recvfrom 函数被调用时——最近向主客户端发送消息的客户端的地址被加载到一
对于我的一门类(class),我必须对服务器和客户端进行编程,并且我们获得了一些示例代码以供使用。这是我感到困惑的片段: main() { int sock, sock_current, c
我在 C 编程方面相对较新,尤其是在套接字编程方面,但我花了很多时间试图帮助自己解决这个问题,但没有找到任何东西,我希望有人能够提供帮助。所以这就是问题所在(我只写了我有问题的那一行) #includ
在作为connect() 的函数中,最后一个参数是sockaddr_in 结构的大小。 很好,但是 sin_zero 未使用(系统不会像我在 stackoverflow.com/questions/2
如果我需要获取 IP 的主机名,我应该使用哪个端口? getnameinfo() 从哪里获取主机名? struct sockaddr_in sa; sa.sin_family = AF_INET
无论我在哪里看,我都会看到以下代码: struct sockaddr_in addr; memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INE
我尝试使用 struct sockaddr_in sin; 但如果我使用它,我会得到 Variable has incomplete type 'struct sockaddr_in' 和 Forw
我在谷歌上搜索了一下,有人说“为了与 struct sockaddr 保持相同的大小”。但是内核不会直接使用 sockaddr(对吧?)。使用时。内核会将其转换回原来的样子。那么为什么需要零填充? s
var sa_tab:[sockaddr?] = [sockaddr](repeating: sockaddr(), count: Int(RTAX_MAX)) let addr:sockaddr =
我是 C 和套接字编程的新手,仍然在 sockaddr_in 中苦苦挣扎结构体: struct sockaddr_in { short sin_family; /*
当我初始化变量时,我会这样做。 int i = 0; char *myText = NULL; 那么,如何初始化struct sockaddr_in类型变量? struct sockaddr_in a
我是一名优秀的程序员,十分优秀!