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
。