C++获得套接字地址

一个套接字绑定了地址,就可以通过函数获取它的套接字的地址了。套接字通信需要本地和远程两端建立套接字,这样获取地址可以分别获取本地套接地址和获取远程套接字地址。

其中,获取本地套接字地址的函数是getsockname,这个函数在下面两种情况下可以获得本地套接字地址。

  • 本地套接字通过bind函数绑定了地址。

  • 本地套接字没有绑定地址,但通过connect函数和远程建立了连接,此时内核会分配一个地址给本地套接字。

二 实战——绑定后获取本地套接字地址

1 代码


 
 
  1. #include <stdlib.h>
  2. #include <sys/types.h>
  3. #include <stdio.h>
  4. #include <sys/socket.h>
  5. #include <netinet/in.h>
  6. #include <string.h>
  7. #include "unistd.h"
  8. #include "errno.h"
  9. #include <arpa/inet.h> //for inet_ntoa
  10. int main()
  11. {
  12. int sfp, nfp;
  13. struct sockaddr_in s_add, c_add;
  14. socklen_t sin_size;
  15. unsigned short portnum = 10051;
  16. struct sockaddr_in serv;
  17. socklen_t serv_len = sizeof(serv);
  18. sfp = socket(AF_INET, SOCK_STREAM, 0);
  19. if ( -1 == sfp)
  20. {
  21. printf( "socket fail ! \r\n");
  22. return -1;
  23. }
  24. printf( "socket ok !\r\n");
  25. printf( "ip=%s,port=%d\r\n", inet_ntoa(serv.sin_addr), ntohs(serv.sin_port));
  26. int on = 1;
  27. setsockopt(sfp, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); //允许地址的立即重用
  28. bzero(&s_add, sizeof(struct sockaddr_in));
  29. s_add.sin_family = AF_INET;
  30. s_add.sin_addr.s_addr = inet_addr( "192.168.0.110");
  31. s_add.sin_port = htons(portnum);
  32. if ( -1 == bind(sfp, (struct sockaddr *)(&s_add), sizeof(struct sockaddr)))
  33. {
  34. printf( "bind fail:%d!\r\n", errno);
  35. return -1;
  36. }
  37. printf( "bind ok !\r\n");
  38. getsockname(sfp, (struct sockaddr *)&serv, &serv_len);
  39. printf( "ip=%s,port=%d\r\n", inet_ntoa(serv.sin_addr), ntohs(serv.sin_port));
  40. return 0;
  41. }

2 运行


 
 
  1. [root@localhost test] # g++ -o test test.cpp
  2. [root@localhost test] # ./test
  3. socket ok !
  4. ip= 0. 0. 0. 0,port= 0
  5. bind ok !
  6. ip= 192.168. 0. 110,port= 10051

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值