我知道这个问题看起来很典型并多次回答,但我认为如果您阅读详细信息,它并不那么常见(我没有找到)。
重点是我正在开发一个c 中的 unix 服务打开套接字并等待连接,当我有连接时我创建一个新流程来处理它,所以可以有同时打开多个连接.
int newfd = accept(sockfd, (struct sockaddr *)&clientaddr, (socklen_t*)&clientaddr_size);
稍后的 (在其他一些方法之后和内部和代码)子进程将连接信息保存到 BBDD,我还需要,在那一刻, to 获取IP地址打开正在处理的连接。
因为可以有同时多个连接和多变的struct sockaddr_in clientaddr
我传递给接受方法的是为所有进程共享我不确定稍后通过这种方式获取 IP 地址信息是个好主意,因为那样的话我可以从打开的另一个连接获取 IP 地址.
我希望能够从文件描述符访问IP地址int newfd
我从接受方法得到的(返回的整数)。是否可以?或者我误解了文件描述符功能?
好的。感谢@alk和@rileyberton我找到了正确的使用方法,获取对等点名称 http://man7.org/linux/man-pages/man2/getpeername.2.html:
int sockfd;
void main(void) {
//[...]
struct sockaddr_in clientaddr;
socklen_t clientaddr_size = sizeof(clientaddr);
int newfd = accept(sockfd, (struct sockaddr *)&clientaddr, &clientaddr_size);
//fork() and other code
foo(newfd);
//[...]
}
void foo(int newfd) {
//[...]
struct sockaddr_in addr;
socklen_t addr_size = sizeof(struct sockaddr_in);
int res = getpeername(newfd, (struct sockaddr *)&addr, &addr_size);
char *clientip = new char[20];
strcpy(clientip, inet_ntoa(addr.sin_addr));
//[...]
}
所以现在在不同的进程中我可以获得IP地址(在“字符串”中)clientip
)发起连接的客户端仅携带文件描述符newfd
通过accept方法获得。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)