提问者:小点点

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


我对客户端如何连接到其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个答案

匿名用户

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

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

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

匿名用户

首先,< 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-的第一个值的指针创建值