C语言 sockaddr_in是否生成一个不同于ip地址的地址?



sockaddr_in结构体是这样的:

struct sockaddr_in
{
sa_family_t    sin_family; address family
in_port_t      sin_port;   port in network byte order 
struct in_addr sin_addr;   internet address 
};

struct in_addr
{
uint32_t       s_addr;     address in network byte order 
};

根据我的理解(如果我错了请纠正我)互联网地址(sin_addr.s_addr)是一个ip地址,但sockaddr_in结构代表了套接字如何设置的整体结构。

如果是这样的话,我想连接到服务器上运行的一些进程,我只需要创建一个结构体sockaddr_in,然后改变它的参数并将其传递给connect()系统调用,然后神奇地我的计算机将知道如何连接到那台计算机?

还有,在C中是否有一个系统调用提供其运行的计算机的ip地址?

struct sockaddr_in包含连接到IPv4端点所需的所有数据。

sin_family族成员始终设置为AF_INET。因为套接字函数期望struct sockaddr的地址,这告诉这些函数它正在接收的结构实际上是struct sockaddr_in。这与用于Unix域套接字的struct sockaddr_un和用于IPv6地址的struct sockaddr_in6等不同。

sin_port成员保存远程机器的端口号,sin_addr成员保存远程机器的IPv4地址。

因此,给定这三个字段,您就有足够的信息连接到远程TCP/IP端口。

另外,C中是否有一个系统调用提供其运行的计算机的ip地址?

对于已连接的套接字,可以使用getsockname获取已连接套接字的本地IP和端口。如果您想获得本地系统上的所有地址,请在Linux和BSD上使用getifaddrs

相关内容

最新更新