当前位置: 首页 > 知识库问答 >
问题:

客户端如何连接到设置为 INADDR_ANY 的服务器?

封烈
2023-03-14

我对客户端如何连接到其struct sockaddr_in设置为ADDRESS.sin_addr的服务器感到非常困惑。s_addr=htonl(INADDR_ANY);

绑定调用后,服务器监听套接字将被设置为INADDR_ANY,客户端将如何连接到设置为INADDR_ANY的套接字?

在connect()系统调用之前,客户端将传递到sockaddr_instruct的地址是什么?是服务器的ip地址吗,我很困惑。

这是我正在玩的一个基本的超级不可靠服务器的代码……

#include <arpa/inet.h> 
#include <sys/socket.h> /*socket()*/
#include <netinet/in.h> /*struct sockaddr_in*/
#include <unistd.h>
#include <stdio.h>

int main(void)
{
    char string[32];
    int ssockfd, csocadsz, nwsockfd;
    unsigned short int ptnum;
    struct sockaddr_in ssockaddr, csockaddr;
    unsigned long int addr;
    ssockfd = socket(AF_INET, SOCK_STREAM, 0);
    
    ssockaddr.sin_family = AF_INET;
    
    printf("Enter port number: ");
    scanf("%hu", &ptnum);
    
    ssockaddr.sin_port = htons(ptnum);
    ssockaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    
    bind(ssockfd, (struct sockaddr *) &ssockaddr, sizeof(ssockaddr));
    
    listen(ssockfd, 5);
    
    csocadsz = sizeof(csockaddr);
    
    nwsockfd = accept(ssockfd, (struct sockaddr *) &csockaddr, &csocadsz);
    
    read(nwsockfd, string, 31);

    printf("Here is the message: %s\n", string);

    write(nwsockfd, "I got your message lol\n", 24);
    
    return 0;
}

我想编写一个连接到这个服务器的客户机,但是我不知道该向它的name.sin_addr.s_addr参数传递什么。

编辑:这是不完整的客户端程序。

#include <netinet/in.h>
#include <stdio.h>
#include <sys/socket.h>
#include <netdb.h>
#include <strings.h>
#include <unistd.h>
#include <string.h>

int main(void)
{
    int clisockfd;
    unsigned short int port_number;
    char sipad[12], string[32];
    struct sockaddr_in saddr;
    
    printf("Enter port number: ");
    scanf("%hu", &port_number);
        
    printf("Enter servers &ip: ");
    scanf("%s", sipad);
    
    clisockfd = socket(AF_INET, SOCK_STREAM, 0);
    
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(port_number);
    saddr.sin_addr.s_addr = /*What do I input here?*/
    
    connect(clisockfd, (struct sockaddr *)&saddr, sizeof(saddr));
    
    printf("Please enter a message without whitespace: ");

    scanf("%s", string);
    
    write(clisockfd, string, strlen(string));
    bzero(string, 256);
    
    read(clisockfd, string, 31);
        
    printf("%s\n", string);
    
    return 0;
}

我该在评论说“/我在这里输入什么?/”的地方放什么?

共有2个答案

笪建章
2023-03-14

首先,< code>sin_addr有一个名为< code>S_un或< code>s_un的匿名联合,具有< code>s_addr或< code>S_addr

IN_ADDR是指每台机器的ip,意思是可以同时在所有IP上绑定、连接等。

如果您想从另一台设备或本地主机IP(127.0.0.1)连接,我建议找到主互联网IP,以便从同一设备进行连接。

char hostname[128];
gethostname(hostname,128);
hostent *host=gethostbyname(hostname);
in_addr ip=*((in_addr *)host->h_addr_list[0]);

可变 ip 就是您的 IP

我们创建一个名为hostname的字符数组,然后将其传递给名为gethostname的函数,其参数1是存储主机名的数组,参数2是该数组的大小

之后,我们创建一个 hostent 类型的指针,并将 gethostbyname 返回的值存储在其中。

然后从< code>h-的第一个值的指针创建值

皇甫雨石
2023-03-14

当你绑定一个套接字时,你指定了内核应该接受连接的IP地址。这允许您只绑定特定网络上有权访问指定地址的连接。例如,如果您将套接字绑定到127.0.0.1,则只有运行在同一系统上并使用IPv4的客户端才能连接,外部无法连接。

如果您指定绑定INADDR_ANY,那么您将绑定到系统拥有或将来拥有的所有地址。这是一个通配符,允许从任何地方进行连接。

将您在bind中指定的IP地址视为一个过滤器。只有当客户端连接到的IP地址与bind中指定的地址匹配时,连接才会发生。INADDR_ANY匹配那里的每个地址。

 类似资料:
  • (**)我创建了一个 ASP.NET Web 服务器,托管 SignalR 中心。我遵循了本教程。它有效。然后我创建了一个Xamarin.Android客户端(*)。问题是我无法连接到服务器。我想,由于我的主机地址中的“本地主机”,我无法连接。例外是相当大的。 如果我的怀疑是正确的,我该如何解决?如何使本地主机看起来像普通服务器? (*) -我也试过Xamarin。一般形式。 (**) - 请看问

  • 我有一个示例Spring启动应用程序来运行图形QL服务器,具有作为客户端,我的pom有以下依赖项: 当我尝试从客户端连接时,出现以下错误: 狩猎决议好心建议。 我还有几个问题: 我应该使用SimpleGraphQLHttpServlet将请求路由到endpoint吗 我正在React UI上使用apollo client,那么它是强制使用apollo server还是spring boot可以工作

  • websocket客户端(使用Autobahn/Python和Twisted)需要连接到websocket服务器:客户端需要向服务器提供其客户端证书,客户端需要检查服务器的证书。例如,这些证书是在Kubernetes minikube安装过程中创建的。特别地: 服务器证书(据我所知为X509格式) 客户端证书~/。minikube/客户。按键 我已经检查过,我可以成功地使用这些证书密钥使用发出库伯

  • 下面是我的服务器代码: 下面是我的客户端活动代码: 以下是客户端活动的xml布局文件: 因此,我开始认为这不是连接端口的问题,而是应用程序的android客户端的问题。但我想不出有什么问题。 顺便说一下,当我试图发送消息时,运行客户端的手机和运行服务器的笔记本电脑都连接到了同一个网络。

  • Java: 在C#中-它停止在“receiver=listener.accept();”在java(android)中-它停止于“sender_socket=new Socket(serverAddr,SERVERPORT);”这应该是java套接字函数的问题--需要另一个函数连接到C#-server。

  • 问题内容: 我的客户端PC通过以太网上的套接字作为服务器PC连接,如何从服务器端代码中找到该客户端的IP。 服务器在新线程中为每个客户端分配一个套接字。 当我在客户端套接字上执行操作时,我仍然会获得服务器IP地址。(是服务器在当前客户端连接上产生的套接字,并将其传递给新的线程)。 问题答案: 我相信您想改用远程地址: