📄 p12-19.c
字号:
#include <sys/socket.h>#include <netinet/in.h>#include <stdio.h>#include <signal.h>#include <fcntl.h>#include <unistd.h>int listenfd, connfd;void sig_urg(int signo);int main(int argc,char **argv){ int n; char buff[100]; sigset_t mask, oldmask; struct sigaction action; /* 设置sigaction结构指明信号动作. */ action.sa_handler = sig_urg; sigemptyset(&action.sa_mask); action.sa_flags = 0; /* 设置SIGURG的句柄 */ sigaction(SIGINT, action , NULL); /* 阻塞SIGURG中断. */ sigemptyset(&mask); sigaddset(&mask, SIGURG); sigprocmask (SIG_BLOCK, &mask, &oldmask); /* 检查参数并建立侦听套接字 */ if(argc == 2) listenfd = socket_listen(NULL,argv[1],NULL); else if(argc == 3) listenfd = socket_listen(argv[1],argv[2],NULL); else { printf("Usage: a.out <host> <port#>\n"); exit(1); } /* 接收连接 */ connfd = accept(listenfd, NULL, NULL); fcntl(connfd,F_SETOWN,getpid()); /* 放开对SIGURG的阻塞 */ sigprocmask (SIG_UNBLOCK, &oldmask,NULL); while(1){ if ((n = read(connfd, buff, sizeof(buff)-1)) == 0){ printf("received EOF\n"); exit(0); } buff[n] = 0; printf("read %d bytes: %s\n",n,buff); }}/* SIGURG信号处理句柄 */void sig_urg(int signo){ int n; char buff[100]; printf("SIGURG received\n"); n = recv(connfd,buff,sizeof(buff-1,MSG_OOB)); buff[n] = 0; printf("read %d OOB byte: %s\n",n,buff);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -