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指向的空间量。在返回时,它包含返回的名称的实际大小(以字节为单位)。如果提供的缓冲区太小,则会截断名称。

所以一定要初始化哦

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值