套接字类型

tcp/ip常用的套接字类型有三种

1.流套接字

用于提供面向连接,可靠的数据传输服务,即tcp协议

2.数据报套接字

数据报套接字使用udp协议进行数据的传输

3.原始套接字

前两种套接字都只能使用在特定的协议中,因此,如果要访问其他协议发送数据必须使用原始
套接字

基本接口函数

创建套接字的函数socket()

image.png

参数介绍
domain,即协议域,又称为协议族(family)
常用的协议族有,AF_INET、AF_INET6、AF_LOCAL(或称AF_UNIX,Unix域socket)、AF_ROUTE等等。

协议族决定了socket的地址类型,在通信中必须采用对应的地址,如AF_INET决定了要用ipv4地址(32位的)与端口号(16位的)的组合、AF_UNIX决定了要用一个绝对路径名作为地址。

type,指定socket类型
常用的socket类型有,SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET等等(socket的类型有哪些?)。

protocol,故名思意,就是指定协议
常用的协议有,IPPROTO_TCP、IPPTOTO_UDP、IPPROTO_SCTP、IPPROTO_TIPC等,它们分别对应TCP传输协议、UDP传输协议、STCP传输协议、TIPC传输协议。
注意:并不是上面的type和protocol可以随意组合的,如SOCK_STREAM不可以跟IPPROTO_UDP组合。
当protocol为0时,会自动选择type类型对应的默认协议。

绑定地址函数bind()[服务器使用]

image.png
参数
sockfd,即socket描述字
它是通过socket()函数创建了,唯一标识一个socket。bind()函数就是将给这个描述字绑定一个名字。
addr,待绑定的地址
一个const struct sockaddr *指针,指向要绑定给sockfd的协议地址。这个地址结构根据地址创建socket时的地址协议族的不同而不同,分别指向前面的。
参数addr为通用地址结构,一般只需提供固定的端口号,即如下设置

服务器listen()和客户端connect()

如果作为一个服务器,在调用socket()、bind()之后就会调用listen()来监听这个socket。
如果客户端这时调用connect()发出连接请求,服务器端就会接收到这个请求。
image.png

listen参数介绍

listen函数的第一个参数即为要监听的socket描述字,第二个参数为相应socket可以排队的最大连接个数。socket()函数创建的socket默认是一个主动类型的,listen函数将socket变为被动类型的,等待客户的连接请求。

服务器accpet设置模板代码

image.png

connect函数原型声明

image.png
connect函数的第一个参数即为客户端的socket描述字,第二参数为服务器的socket地址,第三个参数为socket地址的长度。客户端通过调用connect函数来建立与TCP服务器的连接。

accept()函数

TCP服务器端依次调用socket()、bind()、listen()之后,就会监听指定的socket地址了。
TCP客户端依次调用socket()、connect()之后就向TCP服务器发送了一个连接请求。
TCP服务器监听到这个请求之后,就会调用accept()函数取接收请求,这样连接就建立好了。之后就可以开始网络I/O操作了,即类同于普通文件的读写I/O操作。

总结

服务器端首先会通过socket函数来创建一个套接字,类似于文件资源描述符。scoket有不同的协议族
接着将这个socket绑定到之前创建socket时所选择的不同的协议族的位置,等待客户端连接到这个命名套接字
listen开始监听,接收客户端的tcp连接
accept从listen所维护的队列中取出一条已经连接的TCP,返回该链接的socket描述字。
close关闭套接字,关闭打开的套接字文件描述符号。