socket套接字基本概念
int socket()函数创建的是套接字socket,返回的是socket描述符(套接字描述符),其实就是文件描述符,socket(套接字)其实就是文件
socket()创建了套接字(文件),只是开放了本地系统上面的一个开放资源,如果想其他进程与这个套接字进行通信,需要地址(名字)。
传输层的“协议+端口”可以唯一标识主机中的应用程序(进程)。这样利用三元组(ip地址,协议,端口)就可以标识网络的进程了,网络中的进程通信就可以利用这个标志与其它进程进行交互。
也就是struct sockaddr,套接字地址结构包括1、协议族类 2、端口 3、ip地址
为什么服务器需要bind(serverfd,struct sockaddr_in);
因为socket()创建的只是套接字,没有名字(地址),其他进程无法访问,或者与它通信,只有绑定了一个套接字地址,才能找到它,与它通信。服务器由于是固定ip地址和端口号的,所以必须与固定的套接字地址bind
如果一个TCP客户或者服务器未曾调用bind捆绑一个端口,当调用connect或listen时,内核就要为相应的套接字选择一个临时接口。当我们调用socket创建一个socket时,返回的socket描述字它存在于协议族(address family,AF_XXX)空间中,但没有一个具体的地址。如果想要给它赋值一个地址,就必须调用bind()函数,否则就当调用connect()、listen()时系统会自动随机分配一个端口。
也就是client端的socket其实也是要有名字的,但是这个端口号是随机分配的(由内核分配)这个过程由于connet()产生。
对于INADDR_ANY的理解:本地的所有的ip地址的任一个,如果只有一个ip地址,就是本身ip
知道在listen之前需要先bind一下,用来确保socket能在某个固定的端口监听。而bind的时候,函数参数中的端口填自己将要绑定的端口就行;而IP地址,需要填本机的IP,但是也可以用一个宏INADDR_ANY代替,用这个宏就可以不用查找本机的IP,它就可以代替本机的IP。当时只觉得这个INADDR_ANY比较神奇,但是由于当时觉得用起来很方便,也没出啥问题,也就没有再深究。
就在发现bind的这个机制的同时,我发现其实bind对于源地址也同样具备这种处理方式,当系统具有多IP(多网卡)的情况,当我们把bind函数中的ip参数置0时,就是由内核自己选择分配IP。而之前一直觉得很神奇的INADDR_ANY其实一点也不神奇,它的值其实就是0。所以当我们只有单一IP的时候,我们就可以用INADDR_ANY去代替那个单一的IP,因为内核分配的时候只能选择这一个IP。从而造成了INADDR_ANY就是本机IP的现象。
最新文章
- [转]ubuntu linux下DNS重启后丢失
- 利用OpenShift托管Node.js Web服务进行微信公众号开发
- Blitz Templates介绍
- IIS7.5 请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理。=
- Tiny Spring 分析一
- 当有多于64合乎逻辑的cpu时刻,Windows 下一个Oracle db 实例启动(startup)什么时候会hang(待定)
- 【推荐分享】Python电子书,视频教程(Let's Python系列视频教程等)(百度网盘)
- [Android开发常见问题-12] Android开发中debug.keystore如何使用。
- SSH深度历险(三) EJB Session Bean有状态和无状态的区别与联系
- angular5与angular6的比较
- Java并发编程:volatile关键字解析zz
- FortiGate外网IPSec链路及运维专线链路到个别网段不通
- 高通adsp架构下sensor
- Angularjs中config中置入以下拦截器
- mysql之我们终将踩过的坑(优化)
- 2018面向对象程序设计(Java) 第2周学习指导及要求
- 【ASP.NET】ASP.NET如何发布Web项目
- Leetcode 526
- Django 2.0.1 官方文档翻译:编写你的第一个 Django app,第六部分(Page 11)
- memcached的常用命令