socket(套接字)是网络进程中通信的一组接口,例如就是你和你朋友聊QQ时,两个QQ之间的通信方式。Socket起源于Unix,我们知道Unix里一切皆文件,Socket是这种模式的一种实现。Unix里面有read,open,close等操作函数,Socket里有socket,bind,linsten等函数来操作。
下面介绍常用的Socket api :
1、socket
函数原型:int socket(int domain,int type,int protocol)
用于创建一个socket描述符。指定期望的通信类型,要使用IPv4还是IPv6,使用TCP还是UDP等,根据指定的地址族,数据类型和协议来分配一个套接口的描述字,及其所用的资源的函数。
参数:domain:协议族/域,通常AF_INET(IPv4)、AF_INET6(IPv6)
type:是套接口类型,主要SOCK_STREAM(TCP协议)、SOCK_DGRAM(UDP协议)
protocol:一般为0
返回:成功时返回非负整数。
2、htonl
函数原型:uint32_t htonl(uint32_t hostlong);
函数作用:将整型变量从主机字节顺序转变成网络字节顺序
下面区分一下主机字节序和网络字节序。
主机字节序:不同的CPU的有不同的数据存放方式,就是单片机里面常见的大端和小端。
大端:高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。小端:低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
网络字节序:
4个字节固定如下的传输顺序,首先是0~7bit,其次8~15bit,然后16~23bit,最后是24~31bit。这种传输次序称作大端字节序。由于TCP/IP首部中所有的二进制整数在网络中传输时都要求以这种次序,因此它又称作网络字节序
所以htons函数是两种格式的转换,将地址绑定到socket切记一定要使用该函数,不要去猜想你的CPU是什么端,以免引起不必要的麻烦。
3、inet_ntoa、inet_pton
函数原型:char *inet_ntoa(struct in_addr in);
函数作用:将IP地址,转换为点分十进制的字符串格式;
函数原型:int inet_pton(int af, const char *src, void *dst);
函数作用:将点分十进制的字符串格式的IP地址,转换成整数格式。
参数:af : AF_INET代表IPv4; AF_INET6 代表IPv6;
src:字符串格式点分十进制的IP地址;
dst:转换后的IP地址。
4、inet_addr
函数原型:in_addr_t inet_addr(const char *cp);
函数作用:将一个点分十进制的IP转换成一个长整数型数(u_long类型)。
5、select
函数原型:int select(int maxfdp, fd_set* readfds, fd_set* writefds, fd_set* errorfds, struct timeval* timeout);
函数作用:它能够监视我们需要监视的文件描述符的变化情况——读写或是异常
6、bind
函数原型:bind( SOCKET sockaddr, const struct sockaddr my_addr,int addrlen);
函数作用:套接字绑定到一个地址,并制定一个端口号。将套接字绑定一个IP地址和端口号,因为这两个元素可以在网络环境中唯一地址表示一个进程。
7、listen
函数原型:int listen(SOCKET sockfd, int backlog);
函数作用:listen函数使用主动连接套接字变为被连接套接口,使得一个进程可以接受其它进程的请求,
从而成为一个服务器进程。在TCP服务器编程中listen函数把进程变为一个服务器,并指定相应的套接字变为被动连接。listen函数一般在调用bind之后-调用accept之前调用。
8、accept
函数原型:int accept (int sockfd, struct sockaddr *addr, socklen_t *addrlen)。
函数作用:由TCP服务器调用,socket()返回的套接字用于监听(listen)和接受(accept)客户端的连接请求。这个套接字不能用于与客户端之间发送和接收数据。 accept()接受一个客户端的连接请求,并返回一个新的套接字。连接成功后的收发数据都是通过这个套接字来完成。
9、setsockopt
函数原型:int setsockopt(int sock, int level, int optname, const void *optval, socklen_t optlen);
函数作用:设置与某个套接字关联的选项(设置套接字的属性),例如:recv等函数默认为阻塞模式(block),即直到有数据到来之前函数不会返回,而我们有时则需要一种超时机制使其在一定时间后返回而不管是否有数据到来,这里我们就会用到setsockopt()函数。
10、fcntl
函数原型:int fcntl(int fd, int cmd, long arg);
函数作用:可以用来对已打开的文件描述符进行各种控制操作以改变已打开文件的的各种属性。
以上就是Socket的常用也是最基本的api,C/S架构都是有这几个基本函数搭建的。后面我会介绍基本TCP套接字和基本UDP套接字。