所以我想获取进程(订阅者)正在处理的机器的地址,因此我可以将消息发送到服务器(中介),在特定端口旁边,这样服务器就可以回答其他港口。
也就是说,它们将被连接,但我希望在另一个端口中得到答案。所以我想转发suscriber地址旁边的端口,以便服务器可以连接。
我相信这样做的一种方式类似于找到的例子
http://beej.us/guide/bgnet/output/html/multipage/getaddrinfoman.html
所以我会用getaddrinfo做这样的事情
if ((rv = getaddrinfo(NULL, "3490", &hints, &servinfo)) != 0) {
然后我会查看链接列表中的地址 dir_tcp_srv.sin_addr.s_addr
但我认为这实际上不是正确的用法。我不完全明白,但我相信这不是那样做的。
我想有很多方法可以做到这一点,但基本上我想获取数据(我已经有端口号),以便客户端和服务器角色切换,服务器建立与客户端的连接
编辑:好的,所以我一次又一次地读取服务器在连接后知道客户端地址的方式。我正在重新阅读手册页以了解如何获取该信息但尚未找到它。
另外,我发现了这个:
https://suite.io/guy-lecky-thompson/7sd21g
但我不能说我完全明白了。
Edit2:我认为我的概念很长时间都存在错误。
在我的代码中,我接受这样的接受:
fdSocketDevuelto = accept(sock_tcp,(struct sockaddr )& dir_tcp_srv,(socklen_t )& sizeSock);
我现在相信它会覆盖以前存储在结构中的信息,我曾经用客户端的信息绑定,监听所有这些信息。如果有人可以证实这一点,我可以用这个作为答案回答我自己的问题,或删除整个事情,因为这是我从未完全理解/使用的东西。
答案 0 :(得分:2)
我理解这个问题,因为您希望让服务器找到客户端的IP地址和端口。看看getpeername()
:
来自Beej的指南:
http://beej.us/guide/bgnet/output/html/multipage/getpeernameman.html
// assume s is a connected socket
socklen_t len;
struct sockaddr_storage addr;
char ipstr[INET6_ADDRSTRLEN];
int port;
len = sizeof addr;
getpeername(s, (struct sockaddr*)&addr, &len);
// deal with both IPv4 and IPv6:
if (addr.ss_family == AF_INET) {
struct sockaddr_in *s = (struct sockaddr_in *)&addr;
port = ntohs(s->sin_port);
inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeof ipstr);
} else { // AF_INET6
struct sockaddr_in6 *s = (struct sockaddr_in6 *)&addr;
port = ntohs(s->sin6_port);
inet_ntop(AF_INET6, &s->sin6_addr, ipstr, sizeof ipstr);
}
printf("Peer IP address: %s\n", ipstr);
printf("Peer port : %d\n", port);