对于TCP服务器来说,如果设置的addr为INADDR_ANY,只有在accept后,用getsockname获得的者是本地分配的真实的ip,即针对已经连接的,而不是监听套接口。

用getpeername可以获取客户端的地址,虽然说,在accept时,就可以返回客户端的地址。但是当accept后,fork一个子进程,接着调用 exec时,会将返回客户地址覆盖,在这种情况下,用getpeername。

可以模拟,在windows上运行客户端程序:

#include <winsock2.h>
#include <stdio.h>
#include <string.h>#define MAXLINE 100
#pragma comment(lib, "ws2_32.lib")void dlg_cli(int fd)
{char buf[MAXLINE];int n;for (;;) {if (fgets(buf, MAXLINE, stdin) != NULL) {send(fd, buf, strlen(buf), 0);n = recv(fd, buf, MAXLINE, 0);if (n != 0) {buf[n] = '\0';puts(buf);}}}
}int main(int argc, char **argv)
{WSADATA data;WORD wVersionRequested;int err;wVersionRequested = MAKEWORD(1, 1);err = WSAStartup(wVersionRequested, &data);if (err != 0) return -1;if (LOBYTE(data.wVersion) != 1 || HIBYTE(data.wVersion) != 1) {WSACleanup();return -1;}SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);SOCKADDR_IN addrSer;addrSer.sin_family = AF_INET;addrSer.sin_port = htons(9999);printf("addr=%s\n", argv[1]);addrSer.sin_addr.S_un.S_addr = inet_addr(argv[1]);connect(sockClient, (SOCKADDR*)&addrSer, sizeof(addrSer));dlg_cli(sockClient);closesocket(sockClient);WSACleanup();return 0;
}

注意:windows下,要加#pragma comment(lib, "ws2_32.lib"),如果不加,会提示未定义的符号之类错误

而在虚拟机中的linux下运行服务器,在accept前和后,调用getsockname,打印其分配的地址。如果创建socket时,指定的是INADDR_ANY,在accept前打印的是0.0.0.0,在accept后打印的是真实的网络接口的地址。

getsockname和getpeername相关推荐

  1. getsockname与getpeername用法与区别

    getsockname与getpeername是返回套接口关联的本地协议地址和远程协议地址. int getsockname(int sockfd, struct sockaddr * localad ...

  2. getsockname和getpeername测试

    在两台计算机上建立一个网络连接,需要五个要素:本机地址.本机端口.协议类型.远端端口.远端地址,那么如何从一个建立好的连接上获取这些信息呢?就需要用到 getsockname和getpeername这 ...

  3. getsockname与getpeername

    getsockname与getpeername是返回套接口关联的本地协议地址和远程协议地址. int getsockname(int sockfd, struct sockaddr * localad ...

  4. getpeername函数与getsockname函数的介绍

    getpeername函数用于获取与某个套接字关联的外地协议地址 getsockname函数用于获取与某个套接字关联的本地协议地址 函数定义如下: #include<sys/socket.h&g ...

  5. getsockname函数与getpeername函数的使用

    https://www.tuicool.com/articles/V3Avey getsockname和getpeername函数 getsockname函数用于获取与某个套接字关联的本地协议地址  ...

  6. linux高性能网络编程,Linux高性能网络编程的介绍

    Linux高性能网络编程 一.课程目标 本次课程深入讲解Linux下的socket编程,并以此为基础,着重讨论如何提高网络服务端应用的性能,通过本次课程的学习,学员将收获以下方面的成果: 熟练使用so ...

  7. iOS - Socket 网络套接字

    1.Socket 套接字 所谓 Socket,通常称为 "套接字",网络应用程序通过套接字向网络发送请求或者应答网络请求.Socket 通常用于描述 IP 地址和端口,是应⽤层与 ...

  8. Linux C编程--网络编程2--面向连接的网络编程

    由于之前已经写过一篇介绍Socket通信的文章,故这篇文章是在那一篇的基础上继续补充完善,另一篇的链接如下: http://blog.csdn.net/dlutbrucezhang/article/d ...

  9. 网络编程学习笔记(getnameinfo函数)

    这个函数与getaddrinfo互补,它以一个套接口地址为参数,返回一个描述主机的字符串和一个描述服务的字符串.其函数原型如下: #include <netdb.h> int getnam ...

最新文章

  1. 基于机器视觉的智能人机交互技术
  2. Unbalanced calls to begin/end appearance transitions for XXXX
  3. js 解析 url参数中文的情况
  4. 入门前端学习路线图【送书】
  5. 史迪仔的原型_星际宝贝三个版本对比,莉罗抛弃史迪仔,童年真的回不去了
  6. Qt学习笔记-国际化
  7. bzoj2038[2009国家集训队]小Z的袜子(hose)
  8. video 标签内 音量_HTML5 视频(Video)元素使用详解
  9. net core 2 读取appsettings.json
  10. 原来数据库里的单引号是这么加进去的
  11. 千兆路由器怎么设置网速最快_千兆路由器怎么设置才能发挥最好【图】
  12. 攻击机与靶机的文件共享、演示流程以及第三方主机的访问
  13. 面向对象:期待在正确的时间,遇见更好的你
  14. Vue项目首页_热销推荐组件、周末游组件开发
  15. 一个很有趣的问题:那些用QQ邮箱发应聘邮件的人啊(附:怎样写一封得体的电子邮件)...
  16. 通过jmeter进行用户并发(vu/s)测试
  17. 互联网技术从业者怎么解决系统高并发?
  18. PyGame弹珠游戏双人粗略版
  19. 微软认证解决方案专家
  20. js时间格式化工具类

热门文章

  1. 如何动态修改下拉列表的默认选中项
  2. 《C#3.0 in a Nutshell ,3rd Edition》之序言篇
  3. python爬虫获取的网页数据为什么要加[0-[Python爬虫] 等待网页加载后再获取内容...
  4. 笔记本电脑下载python视频教程-Python的Jupyter Notebook入门教程
  5. python界面设计-手把手教你用Python设计一个简单的命令行界面
  6. 学python爬虫需要什么基础-学爬虫,需要掌握哪些Python基础?
  7. python数据结构推荐书-关于数据结构,有哪些不错的参考书推荐?
  8. python中的time库安装步骤-python中time模块怎么用
  9. python数字类型-Python基础:数据类型-数字(5)
  10. python都可以干什么-python都可以做什么用