Недавно я работал над сокетами в C ++, и я столкнулся с этим:
*(struct in_addr*)&serv_addr.sin_addr.s_addr = *(struct in_addr *)server->h_addr;
Хотя это делает то, что я хочу, я немного растерялся, почему я не могу этого сделать:
(struct in_addr)serv_addr.sin_addr.s_addr = *(struct in_addr *)server->h_addr;
Поскольку он становится указателем, а затем немедленно разыменовывается, разве вторая не должна работать так же хорошо, как первая? Я все еще новичок в C ++, и это немного смущает меня. Любая помощь будет принята с благодарностью. Ниже приведен код. Все, что он делает, это берет имя хоста или IP и выводит IP на экран.
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
using namespace std;
int main(){
int socketfd, portno, rwResult;
struct sockaddr_in serv_addr;
struct hostent* server;
char inputName[50];
//The next block gets the host name and port number and stores them in variables
cout<<"Enter host(Max Size 50): ";
cin>>inputName;
cout<<endl<<"Enter port number: ";
cin>>portno;
cout<<endl;
server = gethostbyname(inputName);
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(portno);
*(struct in_addr*)&serv_addr.sin_addr.s_addr = *(struct in_addr *)server->h_addr;
//This is where I am confused
//(struct in_addr)serv_addr.sin_addr.s_addr = *(struct in_addr *)server->h_addr;
cout<< "Server: "<<inet_ntoa(*(struct in_addr *)server->h_addr_list[0])<<endl;
cout<< "Server: "<<inet_ntoa(*(struct in_addr *)&serv_addr.sin_addr.s_addr)<<endl;
//The two cout's tell me if the address was copied correctly to serv_addr I believe.
return 0;
}