面试问题
- CS模型调用的具体函数大概说一下
socket() bind() listen() accept() connect() #数据上 recv() send() closesocket()
什么是socket
将底层复杂的协议体系,执行流程,进行了封装,封装完的结果,就是一个SOCKET,也就是说,SOCKET是我们调用协议进行通信的操作接口
创建socket
SOCKCET socket{
int af,
int type,
int protocol
};
SOCKET socketlisten=socket(AF_INET,SOCK_STREAM,0);
第一个参数是地址类型:
AF_INET ipv4
AF_INET6 ipv6
AF_BTH 蓝牙
AF_IRDA 红外
第二个参数是套接字类型:
SOCK_STREAM tcp类型
SOCK_DGRAM UDP类型
…
第三个协议:
IPPROTO_TCP
IPPROTO_UDP
bind()函数
给socket绑定端口号和地址。
listen()函数
将socket置于侦听传入连接的状态,表示服务器可接受客户端链接了。
accept()函数
在服务端上创建一个新的socket,将客户端信息和新的socket绑定在一起。
recv()
得到客户端发来的信息。
recv的作用,就是通过socket找到了这个缓冲区,把数据复制放到自己的数组中
send()
向客户端发送数据。
connect()
将客户端和服务端进行链接,将本机的一个指定的socket连接到一个指定地址的服务器socket上去。
解决问题
- 为什么服务器socket有响应的时候就是accept?
答:因为服务器接收、发送数据都是通过绑定客户端信息的socket进行的,不是通过服务器socket,服务器socket只是接受客户端请求的链接,并且把客户端的信息绑定到一个新的socket上,以后的通信都是通过这个socket,所以服务器有响应就是有新的请求链接 - 为什么客户端socket从头到尾都是用的同一个socket?
答:客户端所创建的socket只是本机和指定服务器间建立一个连接,socket结构中填入一些有关对端服务器的信息。这样,以后向对端发送数据报时,就不需要每次进行路由查询等操作以确定对端地址信息和本地发送接口,可以理解为客户端的所创建的socket其实就是和服务器数据交换的socket,与服务器端最开始创建的socket不同。