socket编程

  socket,即套接字,是一种应用于传输层并独立于协议的网络编程接口(API),其作用是完成两个应用程序之间的数据传输。

  API(应用程序接口):应用进程控制权与操作系统控制权进行转换的一个系统调用接口,如下图所示。
在这里插入图片描述
  传输层实现端到端的通信,因此,每一个传输层连接有两个端点。该端点不是主机,不是IP地址,不是应用进程,而是套接字(socket)。根据RFC793的定义:端口号拼接到IP地址就构成了套接字。所谓套接字,实际上是一个通信端点,每个套接字都有一个套接字序号,包括主机的IP地址与一个16位的主机端口号,即形如(主机IP地址:端口号)。例如,如果IP地址是210.37.145.1,而端口号是23,那么得到套接字就是(210.37.145.1:23)。对外通信端点利用IP地址+端口号进行标示,对内部操作系统则利用套接字描述符进行标示。

在这里插入图片描述

  1. 套接字结构体
      当应用进程创建套接字时,操作系统会分配一个数据结构存储该套接字相关信息。
    在这里插入图片描述

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

struct sockaddr_in
{
	u_char sin_len;			//地址长度
	u_char sin_family;		//地址族(TCP/IP:AF_INET)
	u_short sin_port;		//端口号
	struct in_addr sin_addr;		//IP地址
	char sin_zero[8];			//未用(置0)
}
  1. socket函数——创建套接字
      在 Linux 下使用 <sys/socket.h> 头文件中 socket() 函数来创建套接字,代码原型为:
int socket(int af, int type, int protocol);

af——地址族(Address Family),也就是 IP 地址类型,常用的有 AF_INET(IPv4 地址) 和 AF_INET6(IPv6 地址)
type——数据传输方式,常用的有 SOCK_STREAM 和 SOCK_DGRAM
protocol ——传输协议,常用的有 IPPROTO_TCP 和 IPPTOTO_UDP,分别表示 TCP 传输协议和 UDP 传输协议。将 protocol 的值设为 0,系统会自动推演出应该使用什么协议。
SOCK_STREAM 应用于TCP。表示面向连接的数据传输方式。数据可以准确无误地到达另一台计算机,如果损坏或丢失,可以重新发送,但效率相对较慢。常见的 http 协议就使用 SOCK_STREAM 传输数据,因为要确保数据的正确性,否则网页不能正常解析。
SOCK_DGRAM应用于UDP*。表示无连接的数据传输方式。计算机只管传输数据,不作数据校验,如果数据在传输中损坏,或者没有到达另一台计算机,是没有办法补救的。也就是说,数据错了就错了,无法重传。因为 SOCK_DGRAM 所做的校验工作少,所以效率比 SOCK_STREAM 高。

  1. bind函数——绑定套接字本地端点地址
int bind(int sock, struct sockaddr *addr, socklen_t addrlen);  	//Linux

sock——文件描述符
addr ——sockaddr 结构体变量的指针
addrlen —— addr 变量的大小,可由 sizeof() 计算得出

  1. concect函数——客户程序调用connect函数使客户套接字与特定计算机的特定端口套接字进行连接。
int connect(int sock, struct sockaddr *serv_addr, socklen_t addrlen);  //Linux

该函数仅用于客户端,在TCP客户端中用于和服务器建立TCP连接;在UDP客户端中用于与指定服务器端点地址(无连接请求)。

  1. accep函数——服务程序调用accept函数,从处于监听状态的流套接字的客户连接请求队列中取出排在最前的一个客户请求,并且创建一个新的套接字来与客户套接字创建连接通道。
int accept(int sock, struct sockaddr *addr, socklen_t *addrlen);  //Linux

accept函数仅用于TCP套接字以及仅用于服务器,注意在简历连接后,是利用新创建的套接字与客户通信,accept() 会阻塞程序执行(后面代码不能被执行),直到有新的请求到来。

  1. listen函数——置服务器端TCP套接字为监听模式,并设置队列大小
int listen(int sock, int backlog);  //Linux

注意:listen() 只是让套接字处于监听状态,并没有接收请求。接收请求需要使用 accept() 函数。并仅用于服务器端TCP套接字。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值