相关概念
套接字是支持TCP/IP网络通信的基本操作单元。多个TCP连接或多个应用程序进程可能需要通过同一个 TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字(Socket)的接口。
套接字,是支持TCP/IP的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程。
非常非常简单的举例说明下:Socket=Ip address+ TCP/UDP + port。
每一个基于TCP/IP网络通讯的程序都被赋予了唯一的端口和端口号,端口是一个信息缓冲区,用于保留Socket中的输入/输出信息,端口号是一个16位无符号整数,范围是0-65535,以区别主机上的每一个程序(端口号就像房屋中的房间号),低于256的端口号保留给标准,比如pop3的端口号就是110,每一个套接字都组合进了IP地址、端口、端口号,这样形成的整体就可以区别每一个套接字。
Berkeley 套接字(也称为BSD 套接字),一个应用程序接口(API,包括了一个用C语言写成的应用程序开发库),主要用于实现进程间通讯。接口实现用于TCP/IP协议。最初用于Unix系统。
如今,所有的现代操作系统都有一些源于Berkeley套接字接口的实现,它已成为连接Internet的标准接口。
使用Berkeley套接字的系统
- Windows Sockets (Winsock) ,和Berkeley Sockets很相似,最初是为了便于移植Unix程序。
- Java Sockets
- Python sockets
- Perl sockets
套接字API函数
这个列表是一个Berkeley套接字API库提供的函数或者方法的概要:
-
socket()创建一个新的确定类型的套接字,类型用一个整型数值标识(文件描述符),并为它分配系统资源。 -
bind()一般用于服务器端,将一个套接字与一个套接字地址结构相关联,比如,一个指定的本地端口和IP地址。 -
listen()用于服务器端,使一个绑定的TCP套接字进入监听状态。 -
connect()用于客户端,为一个套接字分配一个自由的本地端口号。 如果是TCP套接字的话,它会试图获得一个新的TCP连接。 -
accept()用于服务器端。 它接受一个从远端客户端发出的创建一个新的TCP连接的接入请求,创建一个新的套接字,与该连接相应的套接字地址相关联。 -
send()和recv(),或者write()和read(),249)">recvfrom()和sendto(),用于往/从远程套接字发送和接受数据。 -
close()用于系统释放分配给一个套接字的资源。 如果是TCP,连接会被中断。 -
gethostbyname()和gethostbyaddr()用于解析主机名和地址。 -
select()用于修整有如下情况的套接字列表: 准备读,准备写或者是有错误。 -
poll()用于检查套接字的状态。 套接字可以被测试,看是否可以写入、读取或是有错误。 -
getsockopt()用于查询指定的套接字一个特定的套接字选项的当前值。 -
setsockopt()用于为指定的套接字设定一个特定的套接字选项。
socket()
socket()为通讯创建一个端点,为套接字返回一个文件描述符。 socket() 有三个参数:
-
domain为创建的套接字指定协议集。 例如:
-
AF_INET表示IPv4网络协议 -
AF_INET6表示IPv6 -
AF_UNIX表示本地套接字(使用一个文件)
-
-
type如下:
-
SOCK_STREAM(可靠的面向流服务或流套接字) -
SOCK_DGRAM(数据报文服务或者数据报文套接字) -
SOCK_SEQPACKET(可靠的连续数据包服务) -
SOCK_RAW(在网络层之上的原始协议)
-
-
protocol指定实际使用的传输协议。 最常见的就是
IPPROTO_TCP、IPPROTO_SCTP、IPPROTO_UDP、IPPROTO_DCCP。这些协议都在<netinet/in.h>中有详细说明。 如果该项为“0”的话,即根据选定的domain和type选择使用缺省协议。
如果发生错误,函数返回值为-1。 否则,函数会返回一个代表新分配的描述符的整数。
- 原型:
int socket(int domain, int typeint protocol);
bind()
bind()为一个套接字分配地址。当使用socket()创建套接字后,只赋予其所使用的协议,并未分配地址。在接受其它主机的连接前,必须先调用bind()为套接字分配一个地址。bind()有三个参数:
-
sockfd,表示使用bind函数的套接字描述符 -
my_addr,指向sockaddr结构(用于表示所分配地址)的指针 - addrlen,用socklen_t字段指定了sockaddr结构的长度
如果发生错误,函数返回值为-1,否则为0。
- 原型