📜  如何从套接字对象获取 sockaddr_in (1)

📅  最后修改于: 2023-12-03 15:08:15.534000             🧑  作者: Mango

如何从套接字对象获取 sockaddr_in

在网络编程中,我们常常需要从套接字对象中获取对端地址和端口信息,以便进行数据的发送和接收等操作。对于TCP和UDP协议,套接字地址结构体sockaddr_in是最常用的一种类型。

本文将介绍如何从套接字对象获取sockaddr_in结构体,以便进行更为精细的网络编程操作。

获取套接字地址信息

我们首先需要获取套接字地址信息,以便进行后续的操作。在C语言中,套接字地址信息的获取通常通过getsockname函数来完成,而在C++中则可以通过成员函数getsockname()来实现。

示例代码:

int sockfd;                // 套接字描述符
struct sockaddr_in addr;   // 套接字地址信息

// 获取套接字地址信息
socklen_t addrlen = sizeof(addr);
if (getsockname(sockfd, (struct sockaddr*)&addr, &addrlen) == -1) {
    perror("getsockname");
    exit(EXIT_FAILURE);
}
获取对端地址信息

根据TCP和UDP协议的不同,获取对端地址信息的方法也会有所不同。在TCP协议下,我们可以通过getpeername函数来获取对端地址信息,而在UDP协议下,由于UDP是无连接的,因此需要从接收到的报文中解析出对端地址信息。

获取TCP协议下的对端地址信息

在TCP协议下,获取对端地址信息通常使用getpeername函数。

示例代码:

int sockfd;                    // 套接字描述符
struct sockaddr_in peeraddr;   // 对端地址信息

// 获取对端地址信息
socklen_t addrlen = sizeof(peeraddr);
if (getpeername(sockfd, (struct sockaddr*)&peeraddr, &addrlen) == -1) {
    perror("getpeername");
    exit(EXIT_FAILURE);
}

获取UDP协议下的对端地址信息

在UDP协议下,由于UDP是无连接的,因此需要从接收到的报文中解析出对端地址信息。

示例代码:

int sockfd;                       // 套接字描述符
struct sockaddr_in peeraddr;      // 对端地址信息
socklen_t addrlen = sizeof(peeraddr);

// 接收数据
char buf[BUF_SIZE];
ssize_t nbytes;
nbytes = recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr *)&peeraddr, &addrlen);
if (nbytes == -1) {
    perror("recvfrom");
    exit(EXIT_FAILURE);
}
获取sockaddr_in结构体

根据套接字地址信息和对端地址信息,我们可以构造出sockaddr_in结构体。

示例代码:

struct sockaddr_in addr;          // 套接字地址信息
struct sockaddr_in peeraddr;      // 对端地址信息

// 获取sockaddr_in结构体
struct sockaddr_in localaddr = addr.sin_addr;
struct sockaddr_in remoteaddr = peeraddr.sin_addr;
int localport = ntohs(addr.sin_port);
int remoteport = ntohs(peeraddr.sin_port);

// 输出相关信息
printf("Local Address: %s:%d\n", inet_ntoa(localaddr), localport);
printf("Remote Address: %s:%d\n", inet_ntoa(remoteaddr), remoteport);

以上就是如何从套接字对象获取sockaddr_in结构体的方法,通过这种方法可以更加精细地控制网络编程中的各项操作。