计算机网络学习笔记(4)---Socket编程

目录

1 Socket编程-应用编程接口(API)

 2 Socket编程-客户端/服务端软件设计


1 Socket编程-应用编程接口(API)

1.1 网络程序设计接口

 1.2 应用编程接口API(Application Programming Interface)

1.3 几种典型的应用编程接口 

 

 1.4 Socket API

 

 1.5 Socket 抽象---类似于文件的抽象

当应用进程创建套接字时,操作系统分配一个数据结构存储该套接字相关信息;

地址结构:已定义结构sockaddr_in 

 

 使用TCP/IP协议簇的网络应用程序声明端点地址变量时,使用结构sockaddr_in

 1.6 Scoket编程-Socket API函数

 

 (1)WSAStartup---使用Socket应用程序在使用Socket之前必须首先调用

 (2)WSACleanup---在完成对请求的Socket库的使用后,最后要调用WSAClenup函数

 

 (3)socket---创建套接字socket

(4)Closesocket---关闭一个描述符为sd的套接字socket

(5)bind ---绑定套接字的本地端点地址(IP地址+端口号)

 

 (6)listen---设置服务器端的流套接字处于监听状态---只用于服务端

 (7)connect---只用于客户端

(8)accept ---创建新的套接字socket,以提供并发服务

 (9)send、sendto---发送数据

 

 (10)recv、recvfrom---接收数据

 

 (11)setsockpt、getsockopt---套接字参数的设置及读取

 

总结:Scoket API函数小结 

 

 

 1.7 Socket面向TCP/IP的服务类型

 (1)TCP:可靠、面向连接、字节流传输、点对点;

 (2)UDP:不可靠、无连接、数据报传输;

1.8 网络字节顺序

(1)TCP/IP定义了标准的用于协议头中的二进制整数表示:网络字节顺序(network byte order)

(2)某些Socket API函数的参数需要存储为网络字节顺序(如IP地址、端口号等)

(3)可以实现本地字节顺序与网络字节顺序间转换的函数

1.9 网络应用的Socket API(TCP)调用基本流程 

 

 2 Socket编程-客户端/服务端软件设计

 2.1 解析服务器IP地址

(1)客户端可能使用域名(如study.163.com)或IP地址(如:123.58.180.21)标识服务器;

(2)IP协议需要使用32位二进制IP地址;

(3)需要将域名或点分十进制IP地址转换为32位IP地址;

 2.2 解析服务器(熟知)端口号

(1)客户端还可能使用服务名(如HTTP)标识服务器端口;

(2)需要将服务名转换为熟知端口号;函数getservbyname();返回一个指向结构servent的指针

 2.3 解析协议号

(1)客户端可能使用协议名(如:TCP)制定协议;

(2)需要将协议名转换为协议号(如:6);函数getprotobyname()实现协议名到协议号的转换;

返回一个指向结构protoent的指针;

 2.4 TCP客户端软件流程

 

2.5 UDP客户端软件流程 

 

 2.6 Socket编程-服务器软件设计

2.6.1 四种类型基本服务器

(1)循环无连接(Iterative connectionless)服务器;

(2)循环面向连接(Iterative connection-oriented)服务器;

(3)并发无连接(Concurrent connectionless)服务器;

(4)并发面向连接(Concurrent connection-oriented)服务器;

2.6.2 循环无连接服务器基本流程

(1)创建套接字;

(2)绑定端点地址(INADDR_ANY+端口号);

(3)反复接收来自客户端的请求;

(4)遵循应用层协议,构造响应报文,发送给客户;

1、数据发送: 

(1)服务端不能使用connect()函数;(2)无连接服务器使用sedto()函数发送数据报;

 socket:服务器(UDP)套接字;data:(指针-存储待发送数据缓存的地址);length:(缓存中数据字节数);flags:(调试或控制选项,一般置零);destaddr:(指向结构sockaddr_in)的指针(客户端端点地址);addrlen:地址结构长度;

2、获取客户端点地址

调用recvfrom()函数接收数据时,自动提取;

 socket:(UDP)服务器套接字;buf:存放数据报的缓存地址;length:缓存可用空间;flags:调试或控制选项;from:存放源地址的缓存地址,客户端的端点地址;fromlen:源地址长度;

2.6.3 循环面向连接服务器基本流程

(1)创建(主)套接字,并绑定熟知端口号;

(2)设置(主)套接字为被动监听模式,准备用于服务器;

(3)调用accept()函数接收下一个连接请求(通过主套接字),创建新套接字与该客户建立连接;

(4)遵循应用协议,反复接收客户端请求,构造并发送响应(通过新套接字);

(5)完成为特定客户服务后,关闭与该客户之间的连接,返回步骤3;

2.6.4 并发无连接服务器基本流程

主线程1:创建套接字,并绑定熟知端口号;

主线程2:反复调用recvfrom()函数,接收下一个客户请求,并创建心线程处理该客户响应;

子线程1:接受一个特定请求;

子线程2:依据应用层协议构造响应报文,并调用sedto()发送;

子线程3:退出(一个子线程处理一个请求后即终止);

2.6.5 并发面向连接服务器基本流程

主线程1:创建(主)套接字,并绑定熟知端口号;

主线程2:设置(主)套接字为被动监听模式,准备用于服务器;

主线程3:反复调用accept()函数接收下一个连接请求(通过主套接字),并创建一个新的子线程处理该客户响应;

子线程1:接收一个客户的服务请求(通过新创建的套接字);

子线程2:遵循应用层协议与特定客户进行交互;

子线程3:关闭/释放连接并退出(线程终止);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值