Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Пара вопросов по gcc и g++  (Прочитано 3219 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Gonz

  • Автор темы
  • Новичок
  • *
  • Сообщений: 6
    • Просмотр профиля
Пара вопросов по gcc и g++
« : 20 Мая 2008, 21:13:32 »
1. Почему при компиляции программы на с++ не видится структура sockaddr_in? библиотека sys/socket.h подключена.
2. Если писать на с, то почему нельзя написать вот так:
addr->sin_addr = *(struct in_addr*) host->h_addr_list[0];где addr это указатель на структуру sockaddr_in.
Выдает вот что:
serverirc.c:7: ошибка: доступ по указателю на неполный тип
serverirc.c:7: ошибка: доступ по указателю на неполный тип

Thread

  • Гость
Re: Пара вопросов по gcc и g++
« Ответ #1 : 20 Мая 2008, 21:21:52 »
1. Почему при компиляции программы на с++ не видится структура sockaddr_in? библиотека sys/socket.h подключена.

Ошибку в студию.

2. Если писать на с, то почему нельзя написать вот так:
addr->sin_addr = *(struct in_addr*) host->h_addr_list[0];где addr это указатель на структуру sockaddr_in.
Выдает вот что:
serverirc.c:7: ошибка: доступ по указателю на неполный тип
serverirc.c:7: ошибка: доступ по указателю на неполный тип

Поднял свою прогу трёхгодовой давности, в ней написано
addr.sin_addr.s_addr = *((int*)hst->h_addr_list[0]); - из этого следует, что h_addr_list[0] явно не указатель на структуру.

P.S. Насчёт вменяемости своей проги не уверен.

Оффлайн Gonz

  • Автор темы
  • Новичок
  • *
  • Сообщений: 6
    • Просмотр профиля
Re: Пара вопросов по gcc и g++
« Ответ #2 : 20 Мая 2008, 21:51:14 »
Програма:

#include <sys/socket.h>

int main()
{
sockaddr_in addr;
return 0;
}

temp.cpp: In function ‘int main()’:
temp.cpp:5: ошибка: нет декларации ‘sockaddr_in’ в этой области видимости
temp.cpp:5: ошибка: expected `;' before ‘addr’
gonz@gonz-desktop:~/temp/c++$



Цитировать
Код:
addr.sin_addr.s_addr = *((int*)hst->h_addr_list[0]);
- из этого следует, что h_addr_list[0] явно не указатель на структуру.

А вот такая запись работает:
addr.sin_addr = * (struct in_addr*) host->h_addr_list[0];где addr уже ссылка на эту структуру.
« Последнее редактирование: 20 Мая 2008, 21:59:11 от Gonz »

Thread

  • Гость
Re: Пара вопросов по gcc и g++
« Ответ #3 : 20 Мая 2008, 22:05:42 »
[code][quote author=Gonz link=topic=27930.msg194214#msg194214 date=1211305874]
Програма:

[code]#include <sys/socket.h>

int main()
{
sockaddr_in addr;
return 0;
}

temp.cpp: In function ‘int main()’:
temp.cpp:5: ошибка: нет декларации ‘sockaddr_in’ в этой области видимости
temp.cpp:5: ошибка: expected `;' before ‘addr’
gonz@gonz-desktop:~/temp/c++$

[/quote]

#include <netinet/in.h>

--------------

Из гугла:
struct hostent {
        char    *h_name;        /* официальное имя машины */
        char    **h_aliases;    /* список псевдонимов */
        int     h_addrtype;     /* тип адреса машины */
        int     h_length;       /* длина адреса */
        char    **h_addr_list;  /* список адресов */
}
struct sockaddr_in {
    short            sin_family;   // e.g. AF_INET
    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
};

Так что то, что ты делаешь - полная фигня. Прочитай про UNIX network programming ;][/code][/code]

Оффлайн Gonz

  • Автор темы
  • Новичок
  • *
  • Сообщений: 6
    • Просмотр профиля
Re: Пара вопросов по gcc и g++
« Ответ #4 : 20 Мая 2008, 22:23:33 »
Цитировать
Так что то, что ты делаешь - полная фигня. Прочитай про UNIX network programming
addr.sin_addr = * (struct in_addr*) host->h_addr_list[0];
Почему это фигня? Тот код компилируется. Строку мы "преобразуем" в in_addr. Если так работает, то почему addr.sin_addr нельзя заменить на paddr->sin_addr  в данном случае?

Цитировать
#include <netinet/in.h>
Спасибо, буду писать на с++:). Но все же интересно, почему такая проблема с указателем=(

Оффлайн Gonz

  • Автор темы
  • Новичок
  • *
  • Сообщений: 6
    • Просмотр профиля
Re: Пара вопросов по gcc и g++
« Ответ #5 : 20 Мая 2008, 22:48:24 »
И еще - где обьявлена функция gethostbyname(...)?
Подключение библиотеки netdb.h не помагает.

Thread

  • Гость
Re: Пара вопросов по gcc и g++
« Ответ #6 : 20 Мая 2008, 23:51:04 »
1. Потому что char * != struct in_addr !
Советую почитать вообще про C/C++ ;]
2. Поставь себе manpages-dev и вводи man gethostbyname - там написано, что включать.

 

Страница сгенерирована за 0.039 секунд. Запросов: 25.