是否可以将struct强制转换为另一个?
任何人都可以在这里描述是否可以将struct强制转换为另一个?,c,sockets,casting,struct,C,Sockets,Casting,Struct,任何人都可以在这里描述(struct sockaddr*)&server是如何工作的?是否可以将较大的结构强制转换为较小的结构 请参见以下结构: // IPv4 AF_INET sockets: struct sockaddr_in { short sin_family; // e.g. AF_INET, AF_INET6 unsigned short sin_port; // e.g. htons(3490) struct in_a
(struct sockaddr*)&server
是如何工作的?是否可以将较大的结构强制转换为较小的结构
请参见以下结构:
// IPv4 AF_INET sockets:
struct sockaddr_in {
short sin_family; // e.g. AF_INET, AF_INET6
unsigned short sin_port; // e.g. htons(3490)
struct in_addr sin_addr; // see struct in_addr, below
char sin_zero[8]; // zero this if you want to
};
struct in_addr {
unsigned long s_addr; // load with inet_pton()
};
struct sockaddr {
unsigned short sa_family; // address family, AF_xxx
char sa_data[14]; // 14 bytes of protocol address
};
这是主程序:
int main(int argc , char *argv[])
{
int socket_desc;
struct sockaddr_in server;
//Create socket
socket_desc = socket(AF_INET , SOCK_STREAM , 0);
if (socket_desc == -1)
{
printf("Could not create socket");
}
server.sin_addr.s_addr = inet_addr("74.125.235.20");
server.sin_family = AF_INET;
server.sin_port = htons( 80 );
//Connect to remote server
if (connect(socket_desc , (struct sockaddr *)&server , sizeof(server)) < 0)
{
puts("connect error");
return 1;
}
puts("Connected");
return 0;
}
intmain(intargc,char*argv[])
{
内部插座描述;
服务器中的结构sockaddr_;
//创建套接字
socket\u desc=socket(AF\u INET,SOCK\u STREAM,0);
如果(套接字描述==-1)
{
printf(“无法创建套接字”);
}
server.sin_addr.s_addr=inet_addr(“74.125.235.20”);
server.sinu family=AF\u INET;
server.sin_port=htons(80);
//连接到远程服务器
if(connect(socket_desc,(struct sockaddr*)&server,sizeof(server))<0
{
puts(“连接错误”);
返回1;
}
看跌期权(“关联”);
返回0;
}
这被称为。在这里,两个结构具有相同的大小,因此不存在结构大小的问题。尽管您可以将几乎任何内容强制转换为任何内容,但使用结构很容易出错。您可以将sockaddr\u强制转换为sockaddr,但您通常不能将任何结构强制转换为任何其他结构,并假定这些结构都能正常工作。这是C的“继承”形式(请注意引号)。这是因为C不关心地址中的底层数据,而只关心将其表示为什么
该函数通过使用sau family字段,并将其强制转换到函数内部适当的
sockaddr\u中来确定其实际结构。在C中,可以将任何内容强制转换为任何内容。您甚至可以省略对(struct sockaddr*)的强制转换,可能只是得到一个编译器警告。connect()函数如何访问存储在struct in_addr
中的inet_地址?类似于((struct sockaddr_in*)server->sin addr.s_addr)
printf(“addr:%d\n”,((struct sockaddr_in*)server->sin addr.s_addr));将产生此错误:socket.c:50:54:error:'->'的类型参数无效(包含'struct sockaddr_')为什么?我的问题解决了。谢谢((struct sockaddr_in*)服务器)->sin_addr.s_addr相关||