我正在尝试获取用于建立连接的本地 IP。但是,出于某种原因,我无法使用 getsockname,因为它从不在我的 sockaddr 中设置任何数据。
int fd = socket(/* params */);
int len;
struct sockaddr_in _self;
/* Connection code, I know the connection succeeds and I've tested */
memset(&_self, 0, sizeof (struct sockaddr_in));
getsockname(fd, (struct sockaddr *) &_self, &len);
printf("%s\n", inet_ntoa(_self.sin_addr);
但是,当程序到达 printf 时,它总是由于“段错误”而终止,我认为这是当它试图访问它尚未设置的内存时(我的这个假设是否正确?)如果是这样, 这是否意味着 getsockname 失败了?
最佳答案
在调用getsockname()
之前,您必须将len
初始化为允许的最大大小(即结构的大小)。此长度值由调用修改为包含实际长度。
您还应确保已绑定(bind)套接字描述符。您的测试似乎表明它是针对已建立的 session ,但代码不清楚,因为它只包含一个 socket()
调用。
作为基准,使用以下程序:
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main (void) {
int fd = socket (AF_INET, SOCK_STREAM, 0);
struct sockaddr_in _self;
int len = sizeof (_self);
memset (&_self, 0, len);
bind(fd, (struct sockaddr *) &_self, len);
memset (&_self, 42, len);
getsockname (fd, (struct sockaddr *) &_self, &len);
printf ("%s\n", inet_ntoa (_self.sin_addr));
return 0;
}
这会按预期输出 0.0.0.0
。
关于c - getsockname() c 没有设置值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20941027/