我知道这个问题似乎很典型并多次回答,但我认为如果您阅读详细信息并不常见(我没有找到)。
关键是我正在c中开发一个 unix服务打开一个套接字并等待连接,当我有一个连接时我创建一个新的进程来对待它,因此可以同时打开多个连接。
int newfd = accept(sockfd, (struct sockaddr *)&clientaddr, (socklen_t*)&clientaddr_size);
稍后(之后和其他一些方法和代码)子进程将连接信息保存到BBDD,我也需要,在那个精确的时刻,以获取IP地址打开正在处理的连接。
因为可以同时多个连接,而我传递给accept方法的变量struct sockaddr_in clientaddr
是共享所有过程我不确定以后通过这种方式获取IP地址信息是个好主意,因为我可以从另一个连接打开来获取IP地址。
我希望能够从我从accept方法获得的文件描述符int newfd
中访问IP地址(返回的整数)。可能吗?或者我误解了文件描述符函数?
答案 0 :(得分:12)
确定。感谢@alk和@rileyberton,我找到了正确的方法,getpeername:
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
中),该连接仅携带使用accept方法获得的文件描述符newfd
。
答案 1 :(得分:3)
您可以使用getsockname()
(http://linux.die.net/man/2/getsockname)来获取绑定套接字的IP。
答案 2 :(得分:0)
全连接由两个端点Peer(address:port)<=> My(address:port)唯一标识。获取此信息都需要getpeername()和getsockname()。