getsockname和getpeername第一次调用结果错误

使用场景

在连接建立之后通过getsockname和getpeername进行获取地址和端口,发现出现无法获取正确结果,但在第一次调用的基础上,进行第二次调用,结果正确。

解决方案

要对getsockename和getpeername使用到的参数进行初始化,如下:

struct sockaddr_in addr;
socklen_t addrlen = sizeof(addr);
getsockname(sockfd, (struct sockaddr *)&addr, &addrlen);

如果不进行初始化,会认为addr的空间太小造成截断,信息获取到不完整,man手册中是这么说的:

  • getpeername() returns the address of the peer connected to the socket sockfd, in the buffer pointed to by addr. The addrlen argument should be initialized to indicate the amount of space pointed to by addr. On return it contains the actual size of the name returned (in bytes). The name is truncated if the buffer provided is too small.

  • getpeername()在addr指向的缓冲区中返回连接到socket sockfd的对等点的地址。addrlen参数应该被初始化,以指示addr指向的空间量。在返回时,它包含返回的名称的实际大小(以字节为单位)。如果提供的缓冲区太小,则会截断名称。

所以一定要初始化哦

你可能感兴趣的:(Linux)