我对客户端如何连接到其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;
}
我该在评论说“/我在这里输入什么?/”的地方放什么?
当你绑定一个套接字时,你指定了内核应该接受连接的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-的第一个值的指针创建值