socket网络


socket网络

socket网络是基于tcp/ip协议族而运行的一种网络。


理想网络:类似于我们日常生活中的电话,端到端的进行连接,而且是同步,并且通话的中途不会被监听。
实际网络:实际网路并不是这种端到端的定向传送,而是一种广播式的传送,
例:我们现在需要传送一份数据,我们可以先将数据写在纸上,并且在数据上标示数据所到达的地址,把这张纸投递至邮筒中(网络中),然后邮递员会将邮筒中的信件全部收至邮件中转中心(路由器),
然后邮件在中转中心根据分类,转向下一个位置,直至到达目的地。
以上所描述的就是我们现阶段网络的工作方式。
实际网络理想化:由于现实中可能有数以亿计的信件从中转中心通过中转,所以此时我们可以把网络的连接设计的更加合理:
例: 1 协议保证数据传送的顺序性:避免接收到的数据杂乱无章,无法阅读
2 将大数据分片传送,分包传送
3 将网络地址进行合理的定义(网络地址的分派)


套接字的基本操作:
在linux中,对套接字的操作就是对一个文件的操作,首先可以通过socket创建一个套接字文件,返回一个文件描述符,当套接字被正确的初始化后,就可以对套接字进行读取(read) ,写入(write),同操作其它文件的方式类似,
当进程使用完套接字后,应该调用close关闭它,并释放资源。

建立一个套接字

#include < sys/socket.h>
int socket(int domain,int type,int protocol);

参数说明:
domain参数描述了使用的协议族,通常为以下内容:

地址

协议

协议描述
AF_UNIX

PF_UNIX

unix域
AF_INET

PF_INET

TCP/ip4
AF_INET6

PF_INET6

TCP/IP6
AF_AX25

pf_AX25

业余无线电使用
AF_IPX

PF_IPX

NOvell IPX
AF_APPLETALK

PF_APPLETALK

Apple talk dds
AF_NETCOM

PF_NETCOM

type参数说明:type参数需为以下参数任意一个:
1 SOCK_STREAM
从特定的协议族中指定一个提供流连接协议
2 SOCK_DGRAM
从特定的协议族中指定一个提供数据包协议
3 SOCK_RAM
提供直接向网络设备驱动程序发送包的能力
protocol参数说明:
通常此处为0,让内核根据前两个参数自动选择所需选择的协议,当我们使用PF_INET后,我们可以列举一些允许使用的协议,如下表所示:

协议

描述
IPPROTO_ICMP

IPV4中的消息控制协议
IPPROTO_ICMPV6

IPV6中的消息控制协议
IPPROTO_IPIP

IPIP通道协议
IPPROTO_IPV6

IPV6头
IPPROTO_RAW

原始IP包
IPPROTO_ICP

传输控制协议(TCP)
IPPROTO_UDP

用户报文协议


建立连接

当我们建立一个流套接字后,在使用套接字之前,我们需要让套接字连接上某个目标,这样套接字才可以工作。

服务器端套接字:当套接字建立完毕后,会持续的运行,等待其他进程的连接。


客户端套接字:当套接字建立后,进程会告诉套接字一个需要连接的地址,试着去同服务器建立连接请求,一旦建立连接,那么两个套接字之间就建立连接成功。



绑定套接字

服务器和客户端进程都必须告诉系统套接字所使用的地址。将一个地址和本地套接字相连接的过程称之为绑定。

等待连接

在创建套接字之后,服务器进程将套接字bind到它所监听的地址上,进程通过调用listen(),告诉系统它愿意让其他进程与该套接字建立连接。
一旦套接字被绑定到一个地址后,内核就能处理进程对这个地址的连接。连接的建立还需要通过accept系统调用来接收请求,新的试图连接,并且已经被监听到的连接,会一直处于等待accept为止。
通常accept处于阻塞状态,直到有一个客户端进程试图连接,可以通过fcntl函数将accept标记为非阻塞模式。
#include < sys/socket.h>

int listen(int sock,int backlog);
int accept(int sock,struct sockaddr *addr,socklen_t *addelen);

参数说明:sock套接字文件描述符 backlog 最大等待连接数 大于最大连接数的连接都会被拒绝


连接到一个服务器

客户端连接到服务器通常采用connect函数进行连接。
#include < sys/socket.h>
int connect(int sock,struct sockaddr * servaddr,socklen_t addrlen);

函数返回值
同open一样,当函数返回一个大于0的数,代表创建socket文件描述符成功,否则失败

相关阅读:
linux文件简介
linux文件打开文件的方法