带有结构体参数的函数及其内部对象

发布于 2024-10-27 10:58:10 字数 2215 浏览 8 评论 0原文

我搜索了我的问题,但没有成功,

我不知道如何实现正确的函数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 是我输入的参数,4example: "127.0.0.1".
adr_srvr.sin_addr 存储此 127.0.0.1
srvr_addr 是 char*

可以正常工作的正常代码是(没有函数)在 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");

    }

I searched with my problem but with no success

I do not know how to implement proper function iphost().

Well I have file library.h file in which I store variables and function iphost().

There is another file called main.c where I run function iphost(...).

I really do not know how to fix my problem.

I got error adr_srvr doesn't have element sin_addr.

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

Probably I declared wrong arguments with that stars pointers and ampersands. Can anybody help me?

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 ?

Little help to undestand the code:
I cannot get to adr_srvr.sin_addr.
char* arg is arguments inputing by me, 4example: "127.0.0.1".
adr_srvr.sin_addr store this 127.0.0.1
srvr_addr is char*

The normal code which works okay is (without functon) in 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 {}

...
}

---------

I have similar question so I edit here. How can I implement this in function?:

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");

    }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

红焚 2024-11-03 10:58:10

adr_srvr 是一个指针。要访问其字段,您需要使用 adr_srvr->sin_addr 而不是 adr_srvr.sin_addr

一般来说,当 a 是结构体时,使用 a.field;当 a 是结构体时,使用 a->field指向结构的指针。

adr_srvr is a pointer. To access its fields, you need to use adr_srvr->sin_addr instead of adr_srvr.sin_addr.

In general, use a.field when a is a struct, and a->field when a is a pointer to a struct.

心如狂蝶 2024-11-03 10:58:10

是的,这肯定是一个问题:

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);

Yes, this most certainly is a problem:

inet_aton(arg, &adr_srvr.sin_addr);

Because your function signature is:

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

this means that adr_srvr is a pointer rather than a structure.

You should be using:

inet_aton (arg, &(adr_srvr->sin_addr));
srvr_addr = inet_ntoa (adr_srvr->sin_addr);
本王不退位尔等都是臣 2024-11-03 10:58:10
#include <netinet/in.h> 
  • sockaddr_in 结构定义所在的位置:

这就是inet_aton 签名的

#include <arpa/inet.h>
#include <netinet/in.h> 
  • thats where the sockaddr_in structure definition resides

for the inet_aton signature:

#include <arpa/inet.h>
云雾 2024-11-03 10:58:10

您有一个指向 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);
    }
}

You have a pointer to a struct sockaddr_in, so you have to dereference it. Change your code to the following:

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);
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文