系列文章目录
第二章计算机网络网络应用之Socket编程应用-Socket API函数(WinSock为例)第二章计算机网络网络应用之Socket编程应用-Socket API函数(WinSock为例)
三、Socket编程-Socket API函数(WinSock为例)
没有WSA开头的函数是通用可以window linux unix 使用
调用WSAStartup函数,初始化动态连接库
调用WSACLeanup函数,清除动态连接库
3.1WSAStartup函数
3.2WSACLeanup函数
3.3socket函数
套接字描述符对应该t箭头指向的那个socket
3.4Socket面向TCP/IP的服务类型
对于SOCK_RAW的创建需要root权限
TCP和UDP协议给应用层提供的服务的特点
可靠:数据不遗漏(数据一致)点对点:一个TCP连接只能连接两者,不能连接第三方
3.5Closesocket函数
在linux unix 是Close
当多个应用进程共享一个Socket时,socket的数据结构会有个量存Socket引用次数,一个进程调用Closesocket,首先是在这个进程的套接字描述列表里面,把套接字描述符清除掉,不一定关闭这个描述符列表对应的套接字数据结构,释放它所占用的空间。
如果减到0,意味着没有其他进程在共享,才关闭。
一个进程里的线程Closesocket,无论是否套接字是否物理上释放掉。其他线程都无法访问
3.6bind函数
场景:
主机有两个网络接口,比如两个网卡,分别连接在两个网络上(路由器)这两个网络接口有IP地址1和2
在该主机运行一个服务器
该服务器绑定Ip地址?绑定1,从ip2来的请求无法提供服务。
服务器:所以在设置Bind函数绑定端点地址时,设置端口号(数值端口号或者其他端口号)后Ip地址要设置地址通配符-----意味着在该服务器运行的主机上任意一个有效地址都行
3.7listen函数
队列缓存是先进先出的
3.8connect函数
UDP:UDP协议是无连接的,不会因为用了套接字API的connect函数在udp发生连接,作为UDP调用了,只是指定了端点地址。
TCP调用connect成功函数返回,客户与服务器连接成功。
UDP调用connect成功函数返回,客户与服务器不一定连接成功,因为没有连接。
3.9accept
消息到应用进程后
为客户提供服务的也是新的套接字
由于TCP连接是点对点的,如果不创建新的套接字,则服务器只能为一个客户端提供服务,不能实现多线程多进程并发的TCP服务器
3.9send,sento函数
发送数据的函数
send没有指定数据的端点地址,所以已经有连接了
3.10recv,recvfrom函数
接受数据的函数
3.11setsockopt,getsockopt函数
套接字参数的设置
套接字选定参数的读取
四、Socket API函数小结
除了3.1和3.2是在windows下使用,其他函数在linux unix windows都能用
五、关于网络字节顺序
在osi参考模型中表示层完成数据的转换,当客户端和服务器的系统数据表示不一样的时候,转换
在5层模型时,没有表示层
这件事由这协议做
当我们为套接字API指定某些参数值,给本地用户看,要网络转换本地。网络同理
六、网络应用的Socket API(TCP)调用基本流程
无客户发送连接请求会阻塞,如果有客户来接受请求,然后再创建新的套接字。如果没有,则阻塞(等待)
客户端不用调用80绑定端点地址,操作系统默认帮忙填写了