struct sockaddr_in* addr;
struct addrinfo *hints;
struct addrinfo servinfo;
memset (&servinfo, 0, sizeof (servinfo));
servinfo.ai_family=AF_INET;
servinfo.ai_socktype=SOCK_STREAM;
int i=getaddrinfo("www.google.com","80",&servinfo,&hints);
addr=(struct sockaddr_in*)hints->ai_addr;
printf("ip: %s\r\n",inet_ntoa(addr->sin_addr));
我正在尝试显示主机(Google)的 ip,但出现分段错误,我也尝试像这样输出它:
printf("ip: %s\r\n",hints->ai_addr->sa_data);
但同样的错误发生在这里。
为了可读性,这里我删除了所有错误检查,但它们存在于我的代码中,没有错误出现,getaddrinfo 正常工作,可能错误在最后两行:
addr=(struct sockaddr_in*)hints->ai_addr;
printf("ip: %s\r\n",inet_ntoa(addr->sin_addr));
我做错了什么?所有代码:
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <signal.h>
#include <unistd.h>
#include <string.h>
#include <netdb.h>
void sendall(int socket,char*buf,int size);
int recvall(int socket,char*buf,int size);
int main(int argc, char const *argv[])
{
int sock=socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in* addr;
addr->sin_family=AF_INET;
addr->sin_port=htons(80);
struct addrinfo *hints;
struct addrinfo servinfo;
memset (&servinfo, 0, sizeof (servinfo));
servinfo.ai_family=AF_INET;
servinfo.ai_socktype=SOCK_STREAM;
int i=getaddrinfo("www.google.com","80",&servinfo,&hints);/*servinfo
задает параметры возвращаемых адресов
т.е если мы сделаем так servinfo.ai_socktype=SOCK_STREAM;, то нам
вернутся
адреса хостов работающих на tcp сокетах*/
//в hints записывается вся информация о хосте
if(i!=0){
perror("getaddrinfo");
printf("%d\n",i );
}
switch(i){
case EAI_FAMILY:printf("EAI_FAMILY\n");break;
case EAI_SOCKTYPE:printf("EAI_SOCKTYPE\n");break;
case EAI_BADFLAGS:printf("EAI_BADFLAGS\n");break;
case EAI_NONAME:printf("EAI_NONAME\n");break;
case EAI_SERVICE:printf("EAI_SERVICE\n");break;
//case EAI_ADDRFAMILY:printf("EAI_ADDRFAMILY\n");break;
//case EAI_NODATA:printf("EAI_NODATA\n");break;
case EAI_MEMORY:printf("EAI_MEMORY\n");break;
case EAI_FAIL:printf("EAI_FAIL\n");break;
case EAI_AGAIN:printf("EAI_AGAIN\n");break;
case EAI_SYSTEM:printf("EAI_SYSTEM\n");break;
}
//addr.sin_addr.s_addr=htonl(getipaddr.h_name);
addr=(struct sockaddr_in*)hints->ai_addr;
printf("ip: %s\r\n",inet_ntoa(addr->sin_addr));
return 0;
}
void sendall(int socket,char*buf,int size)
{
short int len,total=0;
do{
if((len=send(socket,&buf[total],size-total,0))==-1){
perror("sendall");
exit(1);
}
total+=len;
}while(total!=len);
}
int recvall(int socket,char*buf,int size)
{
short int total=0,len;
do{
len=recv(socket,&buf[total],size-total,0);
fprintf(stderr, "asdasdasdasdasd,total%dlen%d\n",total,len );
switch(len){
case -1:
perror("recv2");
exit(1);
case 0:
return 0;
}
total=total+len;
}while(buf[total-1]!='\0');
return total;
}
我在这里删除了对未知内存区域的不明智分配:
一切都在犁: