套接字:他是操作系统内核中的一个数据结构,它是网络中的节点进行相互通信的门户。
它是网络进程的ID。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
创建一个套接字:int socket(int domain,int type,int protocol);
第一个参数:协议族,分为两种IPv4和IPv6。IPv4用AF_INET,IPv6用AF_INET6,通常使用IPv4\
第二个参数:套接字类型。分为TCP和UDP两种类型,TCP协议用字节流套接字(SOCK_STREAM),
UDP协议用数据报套接字(SOCK_DGRAM)。
第三个参数:协议控制,通常为0. 以选择的协议族和套接字类型组合的系统默认值。
返回值:失败返回-1,成功返回一个套接字文件描述符。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
连接服务器:int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
第一个参数:连接服务器的套接字文件描述符,一般使用在客户端,为通信套接字
第二个参数:要连接的服务器地址结构体,类型为通用地址结构体,需要强转。
为了配置方便,使用IPv4的地址结构类型sockaddr_in定义一个地址信息变量,
例如sockaddr_in info; info.sin_family = AF_INET; info.sin_port = htons(端口号);
info.sin_addr.s_addr = inet_addr(ip地址,且为字符串)。
&info放在第二个参数,使套接字和地址信息绑定起来。
第三个参数:一般使用sizeof(sockaddr_in),传入地址结构的长度。
返回值:失败返回-1,成功返回0.
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
绑定套接字函数:int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
第一个参数:要绑定的套接字文件描述符
第二个参数:要绑定的地址信息结构体,该函数通常用于服务器,并且绑定服务器自身的IP端口信息。
第三个参数:地址长度信息长度,通常为sizeof(sockaddr)。
返回值:成功返回0,失败返回-1.
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
监听套接字函数:int listen(int sockfd, int backlog);
第一个参数:执行监听的套接字文件描述符
第二个参数:监听的最大队列(客户端同时连接的上限)
返回值:成功返回0,失败返回-1.
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
等待客户端连接:int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
第一个参数:执行等待的监听套接字。
第二个参数:需要新定义一个地址信息结构体,等待到客户端连接后,客户端的地址信息会回写到该参数,
最好初始化为0;
第三个参数:地址信息的长度,因为参数要求指针,所以要定义socklen_t类型的一个变量,并且取地址传进去。
返回值:等待到客户端连接后,会返回一个通信套接字,用于和客户端通信用, 失败则返回-1。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
关闭套接字:close(fd)
这个就不多说了。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
再提一下IO复用:
当程序处于单进程单线程时,想实现既能等待客户端连接,又能接受其他输入并处理,就需要IO复用了
int select(int maxfdpl,fd_set *readset,fd_set *writeset,fd_set *exceptset,const struct timeval *timeout)
第一个参数为检查的最大队列数,这样就不用全部检测,该函数可以管理1024个IO口,用32个32位的整形数组来管理,
一个位管理一个描述符。设置最大队列数就可以节省时间,不用全部检测。
第二个参数:选择让内核检测读
第三个参数:选择让内核检测写
第四个参数:选择让内核检测异常
第五个参数:可以选择三种模式,永远等(设置空指针)、等待固定时间(设置秒数和微秒数)
、根本不等待(设置为0)。
还有一套配套的函数:用于设置监听的队列
void FD_ZERO(fd_set *fdset) 清除所有监听的位
void FD_SET(int fd , fd_set *fdset) 设置要监听的位
void FD_CLR(int fd , fd_set *fdset) 关闭监听位,取消监听
int FD_ISSET(int fd , fd_set *fdset) 检测哪个位被触发,从而执行相应操作
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------