Помогите с этим кодом (дает STATUS_ACCESS_VIOLATION) - PullRequest
1 голос
/ 20 апреля 2011

Ниже приведен код, в котором я хочу отобразить IP-адрес адреса, введенного пользователем, но он дает мне STATUS_ACCESS_VIOLATION, и я не понимаю причину этого.

Отлично компилируется. Вот оно

#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif

// Link to ws2_32.lib
#include <winsock2.h>
#include <stdio.h>
#include <stdlib.h>
struct protoent *proto=NULL;
int main(int count, char *strings[])
{   
  int pid;
  struct hostent *host;
  struct sockaddr_in addr;
  if ( count != 3 )
  {
     printf("usage: %s <addr> < Adressflag = 0 for name and 1 for IP  > /n", strings[0] );
     exit(0);
  }
 if ( count == 3 )
 {
     int flag = atoi(strings[2]);
     printf("flag is %d",flag);
     if ( flag == 0)
     {
         pid = getpid();
         proto = getprotobyname("ICMP");
         host = gethostbyname(strings[1]);
         bzero(&addr, sizeof(addr));
         addr.sin_family = host->h_addrtype;
         addr.sin_port = 0;
         addr.sin_addr.s_addr = *(long*)host->h_addr;
         //traceroute(&addr);
         printf("IP of %s is %s",host->h_name , host-> h_addr);
     }
     else
     {

     }
 }
 return 0;
}

Я запускаю это в Cygwin. Кто-нибудь знает об ошибке и кто-нибудь может сказать, что я делаю неправильно?

Ответы [ 2 ]

2 голосов
/ 20 апреля 2011

Вам действительно нужен * спереди?

addr.sin_addr.s_addr = *(long*)host->h_addr

Это означает, что вы отменяете ссылку на некоторый случайный адрес.

Вы также не проверяете хост на нулевое значение.

0 голосов
/ 20 апреля 2011
addr.sin_addr.s_addr = *(long*)host->h_addr

Вы не можете просто привести char* к long*, чтобы получить число из строки, и вы, вероятно, также не должны разыменовываться.

...