核心内容摘要
米其林餐厅里的那道“暗号”:吃着饭就被邀请,是种怎样的顶级体验?
文章目录TCP服务端基础服务端TCP服务设计模式迭代服务一次处理一个客户端多进程并发服务僵尸进程处理信号处理多线程并发服务嵌入式设备线程注意TCP客户端基础客户端交互式客户端客户端断线重连机制TCP服务端基础服务端// 基础TCP服务器核心流程#defineBUFFER_SIZE1024// 根据设备内存自定义charbuf[BUFFER_SIZE];intmain(){//
创建socketfdsocket(AF_INET,SOCK_STREAM,
;//
准备地址结构addr.sin_familyAF_INET;addr.sin_porthtons(PORT);addr.sin_addr.s_addr0;// INADDR_ANY的另一种写法//
绑定地址bind(fd,(structsockaddr*)addr,sizeof(addr));//
开始监听listen(fd,BACKLOG);//
接受连接阻塞等待newfdaccept(fd,NULL,NULL);// 不关心客户端地址//
接收数据read(newfd,buf,BUFFER_SIZE);//
关闭连接close(newfd);close(fd);return0;}TCP服务设计模式迭代服务一次处理一个客户端// 简化的迭代服务器框架while(
{client_fdaccept(server_fd,NULL,NULL);if(client_fd
continue;handle_client(client_fd);// 处理客户端请求close(client_fd);// 处理完后关闭}缺点无法并发处理多个客户端多进程并发服务// 父进程监听连接创建子进程处理// 子进程处理具体客户端请求结束后退出pid_tpidfork();if(pid
{// 子进程close(server_fd);// 关闭不需要的监听sockethandle_client(client_fd);close(client_fd);exit(
;// 子进程结束}else{// 父进程close(client_fd);// 父进程关闭已分发的客户端socketwaitpid(-1,NULL,WNOHANG);// 非阻塞回收子进程}僵尸进程处理信号处理// 使用信号处理函数回收子进程voidsigchld_handler(intsig){while(waitpid(-1,NULL,WNOHANG)
{// 回收所有已终止的子进程}}// 注册信号处理器signal(SIGCHLD,sigchld_handler);// 更推荐使用sigaction可重启系统调用structsigactionsa;sa.sa_handlersigchld_handler;sigemptyset(sa.sa_mask);sa.sa_flagsSA_RESTART|SA_NOCLDSTOP;sigaction(SIGCHLD,sa,NULL);多线程并发服务// 主线程监听连接创建子线程// 工作线程处理客户端请求void*client_handler(void*arg){intclient_fd*(int*)arg;// 处理客户端...close(client_fd);returnNULL;}// 创建线程处理每个客户端pthread_ttid;int*client_fd_ptrmalloc(sizeof(int));*client_fd_ptrclient_fd;pthread_create(tid,NULL,client_handler,client_fd_ptr);pthread_detach(tid);// 分离线程自动回收资源嵌入式设备线程注意//
设置线程栈大小嵌入式内存有限pthread_attr_tattr;pthread_attr_init(attr);pthread_attr_setstacksize(attr,
;// 8KB栈空间//
线程池模式避免频繁创建销毁线程//
注意线程安全共享数据加锁TCP客户端基础客户端// 核心流程intmain(){//
创建socketfdsocket(AF_INET,SOCK_STREAM,
;//
设置服务器地址addr.sin_familyAF_INET;addr.sin_porthtons(PORT);addr.sin_addr.s_addrinet_addr(
127.
0.
0.