• Поиск по форумам
  •  
      Этот форум закрыт. Новый форум располагается по адресу http://forum.use.ru  

      Nordnet Форум
      Программирование
      Проблема с gtehostbyname
     
    Страницы: 1
    Автор Тема:  Проблема с gtehostbyname
    Lenux 

    регистрация: 27-09-2003 в 08:58
    сообщений: 324

    отправлено 23-05-2006 22:06    
    Вообщем пишет Segmentation fualt, только почему??
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <sys/types.h>
    #include <iostream>
    #include <netdb.h>
    using namespace std;
    int main(int argc, char* argv[]) {
    int sock=socket(AF_INET, SOCK_STREAM, 0);
    sockaddr_in struct_serv;
    hostent* tmp=gethostbyname(strdup(argv[1]));//Да тута-тута
    struct_serv.sin_family=tmp->h_addrtype;
    struct_serv.sin_port=htons(80);
    struct_serv.sin_addr.s_addr=*tmp->h_addr;
    cout<<"Connect: "<<connect(sock, (sockaddr*)&struct_serv, sizeof(struct_serv))<<"n";
    
    char* msg="GET yarchat.ru HTTP 1.1nn";
    cout<<"Send: "<<send(sock, msg, strlen(msg)+2, MSG_OOB)<<"n";
    cout<<"Recv: "<<"n";
    char* buff=new char[505];
    int byte=0;
    while(byte=recv(sock, buff, sizeof(char), 0)) {
    if(byte<=0) break;
    cout<<buff;
    }
    cout<<"n";
    return 0;
    } 
    
    
    NuINu 

    регистрация: 09-04-2004 в 16:36
    сообщений: 2450

    отправлено 24-05-2006 12:49    
    Скажем так, домашнее задание ты сделал на твердую двойку, вот посмотри как можно было решить твою задачу, про все твои ошибки писать бесполезно, возьми хотябы книжку "системное программирование С++ для юникс"
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <sys/types.h>
    #include <iostream>
    #include <netdb.h>
    
    using namespace std;
    
    int main(int argc, char* argv[]) {
      int sock=socket(AF_INET, SOCK_STREAM, 0);
      sockaddr_in struct_serv;
      char* namehost = strdup(argv[1]);
      cout << "Getting from: " << namehost << endl;
      hostent* tmp=gethostbyname(namehost);//Да тута-тута
    
      struct_serv.sin_family=tmp->h_addrtype;
      struct_serv.sin_port=htons(80);
    //  struct_serv.sin_addr.s_addr=*tmp->h_addr;
      memcpy((char*) &struct_serv.sin_addr, (char*)tmp->h_addr, tmp->h_length);
      cout<<"Connect: "<<connect(sock, (sockaddr*)&struct_serv, sizeof(struct_serv))<<"\n";
    
      char* msg="GET yarchat.ru HTTP 1.1\n\n";
      cout<<"Send: "<<send(sock, msg, strlen(msg), MSG_OOB)<<"\n";
      cout<<"Recv: "<<"\n";
      char* buff=new char[505];
      int byte=0;
      while(byte=recv(sock, buff, 504, MSG_WAITALL)) {
         if(byte<=0) break;
         buff[byte] = '\0';
         cout<<buff;
      }
      cout<<"\n";
      free(namehost);
      return 0;
    }
    
    

    NuINu 

    регистрация: 09-04-2004 в 16:36
    сообщений: 2450

    отправлено 24-05-2006 12:51    
    Да кстати Ленукс, не пояснишь, почему когда я отправляю текст он у меня отформатирован, а когда ты отправляешь, он у тебя весь от первой колонки начинается????
    Lenux 

    регистрация: 27-09-2003 в 08:58
    сообщений: 324

    отправлено 24-05-2006 18:29    
    Двойка это тоже достижение:).
    Думаю из-за buff[byte] = '\0';
    Может быть из-за этого. (хотя толком я так и не понял о чём имелось ввиду)

    Чем отличается hostent* tmp=gethostbyname(strdup(argv[1]);
    От hostent* tmp=gethostbyname(namehost);
    По помоему эти две строчки идентичны. (Условно)
    ЗЫ Поверю наслово, что у тя скопилировалось:). (Просто ща под виндой сижу)
    Force 

    регистрация: 06-12-2001 в 00:09
    сообщений: 20128

    отправлено 24-05-2006 18:38    
    2 Lenux:
    Тебе еще выделенную память надо убрать за собой. Ты же грязь не любишь ;)
    Lenux 

    регистрация: 27-09-2003 в 08:58
    сообщений: 324

    отправлено 10-06-2006 12:53    
    А что если нет подключения к сети????
    gethostbyname ругается(Сегментейшеном), если нету подключения к сети(ну или DNS сервера)...
    Как проверить есть ли подключение к сети?
    Lenux 

    регистрация: 27-09-2003 в 08:58
    сообщений: 324

    отправлено 14-06-2006 12:44    
    Ни кто не знает чтоли:( ?
    Как проверить есть ли соединение с DNS сервером или нет.
    NuINu 

    регистрация: 09-04-2004 в 16:36
    сообщений: 2450

    отправлено 14-06-2006 14:22    
    2 Lenux: да никак в принципе и не проверишь...
    посылаешь запрос и ждешь придет ли ответ, или по тайм-ауту отваливаешься...
    так жи и гетхостбунейм работает.
    на счет сейгмейтешена думаю ты гонишь, смотри опять где нибудь память не выделил...
    выводи отладку в stderr после каждой команды...там увидишь где твоя прога падает..

    если у тебя в принципе нету настроенных серверов там смотреть надо что будет... скорее всего быстро вернет что типа незнаю я такого имени...
    Страницы: 1