首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何获取fd_set内部套接字的IP地址?

fd_set是一个用于表示一组文件描述符的数据结构,通常在使用select函数进行多路复用时使用。它本身并不存储套接字的IP地址,而是用于告知操作系统在指定的一组套接字上进行监视。

要获取套接字的IP地址,需要借助套接字的文件描述符。在Linux系统中,可以通过调用getsockname函数来获取套接字的本地IP地址和端口号,通过调用getpeername函数来获取套接字的远程IP地址和端口号。

下面是获取本地IP地址和端口号的示例代码:

代码语言:txt
复制
#include <sys/types.h>
#include <sys/socket.h>
#include #include <netinet/in.h>
#include <arpa/inet.h>

// 假设fd是套接字的文件描述符
struct sockaddr_in addr;
socklen_t addr_len = sizeof(addr);
getsockname(fd, (struct sockaddr*)&addr, &addr_len);
char ip[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &(addr.sin_addr), ip, INET_ADDRSTRLEN);
int port = ntohs(addr.sin_port);

同样地,可以通过类似的方式获取远程IP地址和端口号:

代码语言:txt
复制
#include <sys/types.h>
#include <sys/socket.h>
#include #include <netinet/in.h>
#include <arpa/inet.h>

// 假设fd是套接字的文件描述符
struct sockaddr_in addr;
socklen_t addr_len = sizeof(addr);
getpeername(fd, (struct sockaddr*)&addr, &addr_len);
char ip[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &(addr.sin_addr), ip, INET_ADDRSTRLEN);
int port = ntohs(addr.sin_port);

请注意,这只是获取套接字的IP地址的一种方式,具体的实现可能因编程语言和操作系统而有所不同。此外,如果使用的是IPv6地址,需要使用inet_ntop函数的AF_INET6参数来获取IP地址。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • Linux下select的用法--实现一个简单的回射服务器程序

    2. 函数说明:可以同时监控多个文件描述符是否发生了读写或者异常。(有点像windows下的waitformultipleobjects,可以同时等待多个事件) 参数说明: 1)nfds:要监控的文件描述符的最大值加1,这个值不能错。 2)readfds:指向fd_set的指针。这是一个集合,专门用于监视读取数据的。所有需要监控读取数据的描述符都需要放进这个集合中。比如你需要监控4描述符的读取数据,就把4放进这个集合之中。 3)writefds:同上,这里是专门监视写的集合 4)exceptfds:同上,这里是专门监视异常的集合 5)timeout:超时。指向的timeval 结构体。 如果参数设为NULL,则select是阻塞的。 如果不为空,则表示超时时间(当结构体里面的成员都设为0时,表示不阻塞,立即返回)。

    02

    socket网络编程(三)——select多路复用问题

    在上文《socket网络编程(二)—— 实现持续发送》我们提到了多客户端的时候,多台客户端发送数据到服务端的话,只能有一台客户端可以正常发送和接受数据,另外一台完全没有反应,那这个问题怎么解决呢?很多人可能第一反应想到利用多线程技术,线程多的话用线程池来维护。的确,多线程确实可以实现这个效果,但是,可能很多看见这个但是就不怎么开心了,却不知很多科学科技的进步都是这个但是引发的。但是一个多线程编程很麻烦又容易出错,二是如果连接有几千个的话,线程间切换的开销确实是很大。如果能够在一个线程里就实现这个效果的话,那该多好啊!

    01
    领券