функция с параметром структуры и ее внутренними объектами - PullRequest
0 голосов
/ 28 марта 2011

Я искал со своей проблемой, но безуспешно

Я не знаю, как реализовать правильную функцию iphost().

Ну, у меня есть файл library.h, в котором я храню переменные и функцию iphost().

Есть еще один файл с именем main.c, где я запускаю функцию iphost(...).

Я действительно не знаю, как решить мою проблему.

Я получил ошибку adr_srvr не имеет элемента sin_addr.

/home/user/Desktop/pap_lab2/2/biblioteka.h|23|error: request for member ‘sin_addr’ in something not a structure or union|

Вероятно, я объявил неверные аргументы с указателями звездочек и амперсандами . Кто-нибудь может мне помочь?

library.h
void iphost(char* arg,struct sockaddr_in *adr_srvr)
{
    if(*arg>=(char)'0' && *arg<=(char)'9')
    {
        printf("Prawdopodobnie wprowadzono IP: %s\n", arg);
        inet_aton(arg, &adr_srvr.sin_addr);//here ERROR
        srvr_addr = inet_ntoa(adr_srvr.sin_addr);
    }
}
main.c
iphost(argv[2], &adr_srvr); // OK ?

Небольшая помощь, чтобы понять код:
Я не могу добраться до adr_srvr.sin_addr.
char * arg - аргументы, вводимые мной, 4 примера: "127.0.0.1".
adr_srvr.sin_addr сохранить этот 127.0.0.1
srvr_addr - это символ *

Обычный код, который работает нормально, (без функции) в main.c:

int main (int argc, char *argv[] )
{
  int z;
  int x;
  char *srvr_addr;
  struct sockaddr_in adr_srvr;
  struct sockaddr_in adr;
  struct hostent *he;
  int len_inet;
  int s;
    char dgram[512];
    struct in_addr **addr_list;
    char buf[512];

    //USTAWIENIE POLACZENIA
    //CZY WPISANO IP

    if(argv[1][0]>=(char)'0' && argv[1][0]<=(char)'9')
    {
        printf("Prawdopodobnie wprowadzono IP: %s\n", argv[1]);
        inet_aton(argv[1], &adr_srvr.sin_addr);
        srvr_addr = inet_ntoa(adr_srvr.sin_addr);
    } else {}

...
}

---------

У меня похожий вопрос, поэтому я редактирую здесь. Как я могу реализовать это в функции?:

else
    {
         if ((he = gethostbyname(arg)) == NULL) {  // get the host info
            herror("gethostbyname");
            return 2;
        }

        // print information about this host:
        printf("Wykryty HOST: '%s' ", arg);
        printf("zamieniam na IP: ");
        addr_list = (struct in_addr **)he->h_addr_list;
        printf("%s", srvr_addr = inet_ntoa(*addr_list[0]));
        printf("\n");

    }

Ответы [ 4 ]

2 голосов
/ 28 марта 2011

Да, это, безусловно, проблема:

inet_aton(arg, &adr_srvr.sin_addr);

Поскольку ваша подпись функции:

void iphost (char* arg, struct sockaddr_in *adr_srvr)
//                                         ^
//                                         |
//                                         +- see here

это означает, что adr_srvr является указателем , а не структурой.

Вы должны использовать:

inet_aton (arg, &(adr_srvr->sin_addr));
srvr_addr = inet_ntoa (adr_srvr->sin_addr);
2 голосов
/ 28 марта 2011

adr_srvr - указатель. Чтобы получить доступ к его полям, вам нужно использовать adr_srvr->sin_addr вместо adr_srvr.sin_addr.

Как правило, используйте a.field, когда a является структурой, и a->field, когда a является указателем на структуру.

1 голос
/ 28 марта 2011

У вас есть указатель на struct sockaddr_in, поэтому вы должны разыменовать его. Измените свой код на следующий:

void iphost(char* arg,struct sockaddr_in *adr_srvr)
{
    if(*arg>=(char)'0' && *arg<=(char)'9')
    {
        printf("Prawdopodobnie wprowadzono IP: %s\n", arg);
        inet_aton(arg, &(adr_srvr->sin_addr));
        srvr_addr = inet_ntoa(adr_srvr->sin_addr);
    }
}
1 голос
/ 28 марта 2011
#include <netinet/in.h> 
  • , где находится определение структуры sockaddr_in

для подписи inet_aton:

#include <arpa/inet.h>
...