我正在尝试建立用于连接的本地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失败了?
最佳答案
在调用len
(即结构的大小)之前,必须将getsockname()
初始化为允许的最大大小。这个长度值是通过调用修改来包含实际长度的值。
还应确保套接字描述符已绑定。您的测试似乎表明它是针对已建立的会话的,但代码不清楚,因为它只包含一个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/