具有struct参数的函数及其内部对象

具有struct参数的函数及其内部对象,c,pointers,struct,member,unions,C,Pointers,Struct,Member,Unions,我努力解决我的问题,但没有成功 我不知道如何实现正确的函数iphost() 我有一个文件library.h文件,其中存储变量和函数iphost() 还有另一个名为main.c的文件,我在其中运行函数iphost(…) 我真的不知道如何解决我的问题 我得到错误adr\u srvr没有元素sin\u addr /home/user/Desktop/pap_lab2/2/biblioteka.h|23|error: request for member ‘sin_addr’ in something

我努力解决我的问题,但没有成功

我不知道如何实现正确的函数
iphost()

我有一个文件library.h文件,其中存储变量和函数
iphost()

还有另一个名为
main.c
的文件,我在其中运行函数
iphost(…)

我真的不知道如何解决我的问题

我得到错误
adr\u srvr
没有元素
sin\u addr

/home/user/Desktop/pap_lab2/2/biblioteka.h|23|error: request for member ‘sin_addr’ in something not a structure or union| 理解代码没有什么帮助:
我无法访问adr\u srvr.sin\u addr.
char*arg是我输入的参数,4示例:“127.0.0.1”。
adr_srvr.sin_addr存储此127.0.0.1
srvr\u addr是char*

正常工作的代码是main.c中的(没有functon):

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 {}

...
}
#包括
  • 这就是结构定义中的sockaddru所在的位置
对于inet_aton签名:

#include <arpa/inet.h>
#包括
#包括
  • 这就是结构定义中的sockaddru所在的位置
对于inet_aton签名:

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

adr\u srvr
是一个指针。要访问其字段,您需要使用
adr\u srvr->sin\u addr
而不是
adr\u srvr.sin\u addr

/home/user/Desktop/pap_lab2/2/biblioteka.h|23|error: request for member ‘sin_addr’ in something not a structure or union|
通常,当
a
是结构时,使用
a.field
;当
a
是指向结构的指针时,使用
a.field

adr\u srvr
是指针。要访问其字段,您需要使用
adr\u srvr->sin\u addr
而不是
adr\u srvr.sin\u addr

/home/user/Desktop/pap_lab2/2/biblioteka.h|23|error: request for member ‘sin_addr’ in something not a structure or union|
通常,当
a
是一个结构时,使用
a.field
,当
a
是一个指向结构的指针时,使用
a.field

中有一个指向
struct sockaddr\u的指针,因此必须取消引用它。将代码更改为以下内容:

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);
    }
}
void iphost(char*arg,结构sockaddr\u in*adr\u srvr)
{
如果(*arg>=(char)'0'&&&*argsin_addr));
srvr\u addr=inet\u ntoa(adr\u srvr->sin\u addr);
}
}

您在
中有一个指向结构sockaddr\u的指针,因此必须取消对它的引用。将代码更改为以下内容:

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);
    }
}
void iphost(char*arg,结构sockaddr\u in*adr\u srvr)
{
如果(*arg>=(char)'0'&&&*argsin_addr));
srvr\u addr=inet\u ntoa(adr\u srvr->sin\u addr);
}
}
是的,这肯定是个问题:

inet_aton(arg, &adr_srvr.sin_addr);
因为您的函数签名是:

void iphost (char* arg, struct sockaddr_in *adr_srvr)
//                                         ^
//                                         |
//                                         +- see here
这意味着
adr\u srvr
是指针而不是结构

您应该使用:

inet_aton (arg, &(adr_srvr->sin_addr));
srvr_addr = inet_ntoa (adr_srvr->sin_addr);
是的,这肯定是一个问题:

inet_aton(arg, &adr_srvr.sin_addr);
因为您的函数签名是:

void iphost (char* arg, struct sockaddr_in *adr_srvr)
//                                         ^
//                                         |
//                                         +- see here
这意味着
adr\u srvr
是指针而不是结构

您应该使用:

inet_aton (arg, &(adr_srvr->sin_addr));
srvr_addr = inet_ntoa (adr_srvr->sin_addr);

尝试
inet_aton(arg,&(adr_srvr->sin_addr))
srvr\u addr=inet\u ntoa(adr\u srvr->sin\u addr)尝试
inet\u aton(arg,&(adr\u srvr->sin\u addr))
srvr\u addr=inet\u ntoa(adr\u srvr->sin\u addr)@Michal Mokrzycki::你的意思是包含?@Michal Mokrzycki::你的意思是包含?谢谢你的帮助@paxdiablo@Sylvain@interjay,但在将点更改为箭头后,我得到了类型不完整的差异指针。我是否应该认为这可能是因为在我的库中声明。h开始时:adr_srvr;中的struct struct sockaddr_?编辑:有效:)我在我的库中加入了@adirau的库,而不是main。我真的不知道为什么……edit2:好吧,我知道,我的图书馆是第一次收录的。谢谢大家:)我有类似的问题。在您上面编写的函数中,*adr\u srvr中有一个结构sockaddr\u。如何将内容保存到adr\u srvr.sin\u端口?我试过这样做&(adr\u srvr->sin\u port)=htons(xxx),但我知道这是错误的。提前谢谢。我在哪里能读到关于做那样的事情的书?也许我应该写:adr\u srvr->sin\u port=htons(xxx),但在此之后,我无法发送消息。我认为这是导致adr_srvr的原因…感谢@paxdiablo@Sylvain@interjay的帮助,但在将点更改为箭头后,我得到了类型不完整的差异指针。我是否应该认为这可能是因为在我的库中声明。h开始时:adr_srvr;中的struct struct sockaddr_?编辑:有效:)我在我的库中加入了@adirau的库,而不是main。我真的不知道为什么……edit2:好吧,我知道,我的图书馆是第一次收录的。谢谢大家:)我有类似的问题。在您上面编写的函数中,*adr\u srvr中有一个结构sockaddr\u。如何将内容保存到adr\u srvr.sin\u端口?我试过这样做&(adr\u srvr->sin\u port)=htons(xxx),但我知道这是错误的。提前谢谢。我在哪里能读到关于做那样的事情的书?也许我应该写:adr\u srvr->sin\u port=htons(xxx),但在此之后,我无法发送消息。我认为这会导致adr\u srvr。。。