socket - 简述

来源:互联网 发布:java开源微信商城 编辑:程序博客网 时间:2024/05/17 01:28

套接字

 ——简述

 

1、套接字是什么

1.1、它不是一个什么东西,它是指一种机制,用在位于不同计算机的不同进程之间进行通信的机制(在任何一个系统中,机制都起着基础性的、根本的作用。), 简单来说就是网络进程间通信(network IPC) 。套接字的英文是socket,而socket 的英文原意就是“孔”或“插座”,这里取与”插座“相近的意思。套接字为什么叫做套接字,把socket翻译命名为套接字,闪耀着智慧的光芒,大家自己琢磨。

1.2、套接字在计算机系统中的位置:

      每台计算机都有对应的网卡和网卡驱动,在这之上,可以有多个套接字。也就是说,套接字的运作基于网卡驱动和网卡,被传输的数据先经过本机的网卡驱动(含各种网络协议) 、网卡、有线/无线网路,然后是对方机器的网卡、网卡驱动,再到对应的套接字。

2、一些主要接口:

2.1、UNIX like 系统下的几个主要接口:

socket()

创建套接字

bind()

将套接字和网络地址联系在一起

connect()

将套接字和远程网络地址连在一起

listen()

侦听传入的连接意图

accept()

接受传入的连接意图

send()

发送数据

recv()

接收数据

shutdown()

禁用读端/写端

close()

关闭套接字

2.2、函数原型:

①int socket(int domain, int type, int protocol); 参数domain(域)确定通信的特性,参数type确定套接字的类型,进一步确定通信特性,参数protocol通常是零,表示按给定的域和套接字类型选择默认的协议。

②int bind(int sockfd, const struct sockaddr *addr, socklen_t len); 

③int connect(int sockfd, const struct sockaddr *addr, socklen_t len); 参数中指定的地址为想与之通信的地。

④int listen(int sockfd, int backlog); backlog指明可以连接的最大请求数量。

⑤int accept(int sockfd, struct sockaddr *restrictt addr, socklen_t *restrict len); accept的返回值为套接字描述符,

⑥ssize_t send(int sockfd, const void *buf, size_t nbyts, int flags); send和write很像,flags标志可以改变处理传输数据的方式。如果send成功返回并不表示对方成功接收,只表示成功发送到网络。

⑦ssize_t recv(int sockfd, void *buf, size_t nbytes, int flags); 跟send类似,flags可以指定如何接收数据。

⑧int shutdown(int sockfd, int how); how 是SHUT_RD则关闭读端,SHUT_WR则关闭写端。而同时禁止输入输出则传递实参SHUT_RDWR 。

⑨int close(int sockfd);

3、一般socket通信程序的流程

3.1、面向连接的套接字:

3.2、无连接套接字:

对于面向无连接的socket程序,没有client和server之分,两个对应的程序流程都是一样的。也就是先调用socket() 创建,调用bind() 绑定,然后就可以收发数据了。

4、另外一些套接字的特性

4.1、套接字接口能够同时向另外进程发送或从另外进程接收数据,依照套接字的类型而调用语义。共有四种套接字:①长度固定、有序、可靠的面向连接报文传递;②有序、可靠、双向的面向连接字节流;③长度固定的、无连接的不可靠报文传递;④IP协议的数据报接口。每一种类型都分别代表了一种不同类型的通信服务。在另外一些平台只有3种:①流套接字,②数据报套接字,③原始套接字。

4.2、套接字描述符在UNIX系统中是用文件描述符来实现的。事实上,许多处理文件描述符的函数都可以处理套接字描述符。

4.3、带外数据(out-of-band data)是一些通信协议所支持的可选特征,允许更高优先级的数据比普通数据优先传输。可以在发送函数的指定标志MSG__OOB实现。TCP支持而UDP不支持。

4.4、非阻塞特性。通常,recv函数没有数据可用时会阻塞等待,当套接字输出队列没有足够的空间来发送消息时函数send会阻塞。但在非阻塞模式,这些情况下,函数不会阻塞而是失败。

 

2012-10-05

by Jack

原创粉丝点击