Socket APT
套接字为客户和服务提供应用进程间通信的抽象机制
一台主机在应用层会有多个进程,如何连接?
给套接字绑定端口
标售通信端点(对外):IP+端口、
操作系统/进程如何管理套接字(对内):套接字描述符(socket descriptior)
Socket APT函数(WinSock)
WSAStratup:
使用Socket的应用程序在使用Socket之前必须首先调用该函数
两个参数:
1.第一个参数知名程序请求使用的WinSock版本,其中高字节指明副版本,地位字节指明主版本
十六进制整数,如0x102表示2.1版
2.第二个参数返回实际的WinSock的版本信息
指向WSADATA结构的指针
SOCK_DGRAM报文套接字
SOCK_STREAM流式套接字
SOCK_RAW原始套接字(需要高级权限才能使用)
TCP:可靠,面向连接,字节流传输,点对点
UDP:不可靠,无连接 数据报传输
bind函数 :绑定套接字的本地端点地址
IP地址+端口号
参数:
套接字描述符(sd)
端点地址(localaddr)
结构sockaddr_in
客户端一般不需要绑定端口
服务端需要要绑定端口
Q:一个服务器主机可能有多个IP地址,从不同网络访问可能会产生问题,,如何解决?
服务器应该绑定地址通配符:INADDR_ANY,这样只要在主机上有效的IP地址都成立
listen函数 int listen(sd,queuesize);
作用:
使位于服务器端的流套接字处于监听状态
仅服务端调用
仅用于面向连接的流式套接字
queuesize:设置连接请求队列的大小(queuesize)
返回值:0成功,SOCKET_ERRPOR:失败
connect函数:
connect(sd,saddr,saddrlen)
客户端程序调用connect函数来使客户端套接字(sd)和特定的计算机的特定端口(saddr)的套接字进行连接
connect函数仅用于客户端
TCP/UDP:
TCP客户端:向指定的saddr发送请求,建立TCP连接
UDP客户端:仅指定服务器端点地址
accept函数:
newsock=accpet(sd,caddr,caddrlen);
服务器程序调用accept函数从处于监听状态的流套接字sd的客户端连接
请求队列中取出排在最前的一个客户请求,并且创建一个新的套接字来
和客户套接字创建连接通道
仅用于TCP套接字,仅用于服务器
真正为客户服务,连接的是新的套接字
为了实现并发的tcp服务器
send,sendto函数:用于发送数据
recv ,recvfrom:用于接受数据