Socket编程:基本函数介绍
1.socket()函数:创建一个socket描述字
int socket(int domain, int type, int protocol)
- 用于打开操作
- domain: 协议域(定义了socket的地址类型)---------常用的有: AF_INET、AF_INET6、AF_LOCAL(或称AF_UNIX,Unix域socket)、AF_ROUTE等
- type: 指定socket类型--------常用的有 :SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET等
- protocol: 指定协议(定义了要采用的通讯协议)--------常用的有 :IPPROTO_TCP、IPPTOTO_UDP、IPPROTO_SCTP、IPPROTO_TIPC等,它们分别对应TCP传输协议、UDP传输协议、STCP传输协议、TIPC传输协议
- type 和 protocol 不是随意组合的, SOCK_STREAM不可以跟IPPROTO_UDP组合。当protocol为0时,会自动选择type类型对应的默认协议
2.bind()函数:bind()函数把一个地址族中的特定地址赋给socket(特定名字)
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen)
- sockfd: socket描述字,它是通过socket()函数创建的,唯一标识一个socket;
- addr: const struct sockaddr *指针,指向要绑定给sockfd的协议地址。这个地址结构根据地址创建socket时的地址协议族的不同而不同;
- addrlen:对应的是地址的长度
- 因为服务器在启动时都会绑定一个地址(如ip地址+端口号),客户就可以通过它来链接服务;而客户端不用指定,由系统随机生成;----------------因此服务器端在listen()之前要先调用bind(),而客户端在connect()时由系统随机生成;
3.listen()函数及connect()函数
- 作为服务器,在调用socket()和bind()函数之后,调用listen()函数监听这个socket,如果客户端这时调用connect()时,服务器端就会收到请求
int listen(int sockfd, int backlog)
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen)
- listen()函数中第一个参数即为要监听的socket描述字,第二个参数为相应socket可以排队的最大连接个数
- connect函数的第一个参数即为客户端的socket描述字,第二参数为服务器的socket地址,第三个参数为socket地址的长度。客户端通过调用connect函数来建立与服务器的连接。
4.accept()函数
- 服务器端依次调用socket()、bind()、listen()之后,就会监听指定的socket地址了。客户端依次调用socket()、connect()之后就像服务器发送了一个连接请求。服务器监听到这个请求之后,就会调用accept()函数取接收请求,这样连接就建立好了。之后就可以开始网络I/O操作了,即类同于普通文件的读写I/O操作。
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
- accept函数的第一个参数为服务器的socket描述字,第二个参数为指向struct sockaddr *的指针,用于返回客户端的协议地址,第三个参数为协议地址的长度。如果accpet成功,那么其返回值是由内核自动生成的一个全新的描述字,代表与返回客户的连接。
5.读写函数
经过以上步骤,网络中不同进程之间的通信已经建立,可以进行网络I0操作了
- read()/write()
- recv()/send()
- readv()/writev()
- recvmsg()/sendmsg()
- recvfrom()/sendto()
6.close()函数
- 完成连接以及读写操作之后,进行关闭