名词概念:
套接字:套接字是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。可以将套接字看作不同主机间的进程进行双间通信的端点,它构成了单个主机内及整个网络间的编程界面。
文件描述符(File descripter):就是一个整数,这个整数唯一标识了操作系统中某个被打开的“文件”。
新函数:
基本函数:
SOCKET socket(int domain, int type, int protocol);
解释:
domain
:指定地址族,通常使用 AF_INET
表示 IPv4 地址族,AF_INET6
表示 IPv6 地址族
type
:指定套接字类型,SOCK_STREAM
表示面向连接的字节流套接字(通常用于 TCP 协议),SOCK_DGRAM
表示无连接的数据报套接字(通常用于 UDP 协议)。
protocol
:指定使用的协议,对于 SOCK_STREAM
套接字,通常使用 IPPROTO_TCP
表示 TCP 协议,对于 SOCK_DGRAM
套接字,通常使用 IPPROTO_UDP
表示 UDP 协议。
perror();
该库函数的原型是:void perror(const char *s);
参数s:如果我们想要在错误提示字符串之前添加自己想要的打印信息,就通过此参数传入,如果不需要添加信息,则让其为空字符串即可。
同时,在使用该库函数时需要包含头文件:#include <stdio.h>
bind();
此函数能够将套接字文件描述符、端口号和ip
绑定到一起
注意:
绑定的一定是自己的 ip和和端口,不是对方的;比如对于TCP服务器来说绑定的就是服务器自己的ip和端口
关于监听合集的函数:
// 创建一个文件描述符集合
fd_set readfds;
// 此操作将集合中所有文件描述符标志位清零,确保集合初始为空
FD_ZERO(&readfds);
// 此操作将指定的监听套接字添加到文件描述符集合中,使 select 函数能对其进行状态监测
FD_SET(listenSocket, &readfds);
// 设置超时时间为 10 秒
struct timeval timeout;
timeout.tv_sec = 10;
timeout.tv_usec = 0;
// 此操作调用 select 函数来监测文件描述符集合中的套接字状态,若有状态变化或超时则返回
int result = select(0, &readfds, NULL, NULL, &timeout);
// 此操作检查监听套接字是否在集合中且状态变为可读,若成立则意味着可能有新连接到来
if (FD_ISSET(listenSocket, &readfds)) {
// 处理新连接的相关操作
}
// 此操作将指定的监听套接字从文件描述符集合中移除
FD_CLR(listenSocket, &readfds);
注意:
select函数会改变监听合集的值,所以在使用的时候通常会将监听合集复制一份,使用副本进行监听。