TCP套接字实现过程
服务器端步骤
- 创建套接字
- 绑定套接字
- 设置套接字为监听模式,进入被动接受连接请求状态
- 接受请求,建立连接
- 读/写数据
- 终止连接
客户端步骤
创建套接字
与远程服务程序连接
读/写数据
终止连接
实现UDP套接字基本步骤分为服务器端和客户端两部分:
服务器端
- 建立UDP套接字;
- 绑定套接字到特定地址;
- 等待并接收客户端信息;
- 处理客户端请求;
- 发送信息回客户端;
- 关闭套接字;
客户端步骤
建立UDP套接字;
发送信息给服务器;
接收来自服务器的信息;
关闭套接字
/**
该函数既可解析IPv4地址,也可解析IPv6地址;
该函数既可接收域名,也可接收点分十进制参数
当hostname为点分十进制时,函数并不执行网络查询,而是直接将其拷贝到结果字段中。
此函数返回的非空指针指向下面的hostent结构
*/
#include <netdb.h>
struct hostent *gethostbyname(const char *hostname)
//返回:非空指针-成功;空指针-出错,同时设置h_error
服务器分类
按处理方式分类
迭代服务器
并发服务器
进程拥有独立的地址空间、执行堆栈、文件描述符
当进程间共享某一资源时,需注意两个问题:同步问题和通信问题。
产生新的子进程后,父进程要关闭已连接套接字,而子进程要关闭监听套接字,
多进程并发服务器建立过程:
建立连接->服务器调用fork()产生新的子进程->父进程关闭连接套接字,子进程关闭监听套接字->子进程处理客户请求,父进程等待另一个客户连接。
线程或者是可联合的(joinable)(默认),或者是分离的(detached)。当可联合的线程终止时,其线程id和退出状态将保留,直到另外一个线程调用pthread_join。分离的线程则像守护进程,当它终止时,释放所有资源,我们不能等待它终止。
操作系统将保证同时只有一个线程能成功完成对一个互斥锁的加锁操作。
如果互斥锁是静态分配的,就将mptr初始化为常值PTHREAD_MUTEX_INITIALIZER。
//FD_ZERO:清空fd_set描述符集合
void FD_ZERO(fd_set *fdset); /*所有bit位置0*/
//FD_SET:往fd_set中添加描述符,建立文件描述符与fd_set联系
void FD_SET(int fd, fd_set *fdset); /*将fd位置1*/
//FD_CLR:在fd_set中删除描述符
void FD_CLR(int fd, fd_set *fdset); /*将fd位置0*/
//FD_ISST:检查fd_set联系的文件描述符fd是否可读写
int FD_ISSET(int fd, fd_set *fdset); /*检测fd位是否为1*/