????????通常服务器在启动的时候都会绑定一个众所周知的地址(如IP地址+端口号),用于提供服务,客户就可以通过它来接连服务器;
????????而客户端不用指定,由系统自动分配一个端口号和自身的IP地址组合。
????????——这就是为什么通常服务器端在listen之前会调用bind(),而客户端就不会调用,而是在connect()时由系统随机生成一个。
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
????????bind()函数把一个地址族中的特定地址赋给socket。例如对应AF_INET、AF_INET6就是把一个ipv4或ipv6地址和端口号组合赋给socket。
? ? ? ? 注意:在将一个地址绑定到socket的时候,请先将主机字节序转换成为网络字节序。
????????TCP服务器端依次调用socket()、bind()、listen()之后,就会监听指定的socket地址了。
????????TCP客户端依次调用socket()、connect()之后就想TCP服务器发送了一个连接请求。
????????TCP服务器监听到这个请求之后,就会调用accept()函数取接收请求,这样连接就建立好了。之后就可以开始网络I/O操作了,即类同于普通文件的读写I/O操作。
????????网络I/O操作有下面几组:
- read()/write()? ? ? ? ? ? ? ? 读/写
- recv()/send()? ? ? ? ? ? ? ? 收/发
- readv()/writev()
- recvmsg()/sendmsg()
- recvfrom()/sendto()
????????Socket又称为套接字,它是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。?
????????其实站在你的角度上看,socket就是一个模块。我们通过调用模块中已经实现的方法建立两个进程之间的连接和通信。也有人将socket说成IP+Port,因为IP是用来标识互联网中的一台主机的位置,而Port是用来标识这台机器上的一个应用程序。 所以我们只要确立了IP和Port就能找到一个应用程序,并且使用socket模块来与之通信。
????????参考来源:https://www.cnblogs.com/clschao/articles/9593164.html
|