UNP函数笔记十四: 带外数据
来源:互联网 发布:linux qt程序打包发布 编辑:程序博客网 时间:2024/06/05 19:28
第二十四章 带外数据:
#include <sys/socket.h>int sockatmark(int sockfd); have oob mark return 1, have not oob mark return 0, error return -1
示例:
#include <sys/ioctl.h>int sockatmark(int fd){ int flag; if (ioctl(fd, SIOCATMARK, &flag) == -1) { return(-1); } return(flag != 0);}
#include "err_exit.h"#include "tcp_connect.h"int main(int argc, char ** argv){ int sockfd; if (argc != 3) { printf("usage: tcpsend01 <host> <port#>\n"); exit(1); } sockfd = tcp_connect(argv[1], argv[2]); if (write(sockfd, "123", 3) != 3) { err_exit("write error"); } printf("wrote 3 bytes of normal data\n"); sleep(1); if (send(sockfd, "4", 1, MSG_OOB) != 1) { err_exit("send error"); } printf("wrote 1 byte of OOB data\n"); sleep(1); if (write(sockfd, "56", 2) != 2) { err_exit("write error"); } printf("wrote 2 bytes of normal data\n"); sleep(1); if (send(sockfd, "7", 1, MSG_OOB) != 1) { err_exit("send error"); } printf("wrote 1 byte of OOB data\n"); sleep(1); if (write(sockfd, "89", 2) != 2) { err_exit("write error"); } printf("wrote 2 bytes of normal data\n"); sleep(1); exit(0);}
#include <fcntl.h>#include "err_exit.h"#include "my_signal.h"#include "tcp_listen.h"int listenfd;int connfd;void sig_urg(int signo){ int n; char buff[100]; printf("SIGURG received\n"); if ((n = recv(connfd, buff, sizeof(buff)-1, MSG_OOB)) < 0) { err_exit("recv error"); } buff[n] = 0; /* null terminate */ printf("read %d OOB byte: %s\n", n, buff);}int main(int argc, char ** argv){ int n; char buff[100]; if (argc == 2) { listenfd = tcp_listen(NULL, argv[1], NULL); } else if (argc == 3) { listenfd = tcp_listen(argv[1], argv[2], NULL); } else { printf("usage: tcprecv01 [ <host> ] <port#>\n"); } if ((connfd = accept(listenfd, NULL, NULL)) == -1) { err_exit("accept error"); } if (my_signal(SIGURG, sig_urg) == SIG_ERR) { err_exit("my_signal error"); } if (fcntl(connfd, F_SETOWN, getpid()) == -1) { err_exit("fcntl error"); } for ( ; ; ) { if ((n = read(connfd, buff, sizeof(buff)-1)) < 0) { err_exit("read error"); } else if (n == 0) { printf("received EOF\n"); exit(0); } buff[n] = 0; /* null terminate */ printf("read %d bytes: %s\n", n, buff); }}
#include "err_exit.h"#include "tcp_listen.h"int main(int argc, char ** argv){ int listenfd; int connfd; int n; int justreadoob = 0; char buff[100]; fd_set rset; fd_set xset; if (argc == 2) { listenfd = tcp_listen(NULL, argv[1], NULL); } else if (argc == 3) { listenfd = tcp_listen(argv[1], argv[2], NULL); } else { printf("usage: tcprecv02 [ <host> ] <port#>\n"); exit(1); } if ((connfd = accept(listenfd, NULL, NULL)) == -1) { err_exit("accept error"); } FD_ZERO(&rset); FD_ZERO(&xset); for ( ; ; ) { FD_SET(connfd, &rset); if (justreadoob == 0) { FD_SET(connfd, &xset); } if (select(connfd + 1, &rset, NULL, &xset, NULL) == -1) { err_exit("select error"); } if (FD_ISSET(connfd, &xset)) { if ((n = recv(connfd, buff, sizeof(buff)-1, MSG_OOB)) < 0) { err_exit("recv error"); } buff[n] = 0; /* null terminate */ printf("read %d OOB byte: %s\n", n, buff); justreadoob = 1; FD_CLR(connfd, &xset); } if (FD_ISSET(connfd, &rset)) { if ((n = read(connfd, buff, sizeof(buff)-1)) < 0) { err_exit("read error"); } else if (n == 0) { printf("received EOF\n"); exit(0); } buff[n] = 0; /* null terminate */ printf("read %d bytes: %s\n", n, buff); justreadoob = 0; } }}
#include "err_exit.h"#include "tcp_listen.h"int main(int argc, char ** argv){ int listenfd; int connfd; int n; int on = 1; char buff[100]; if (argc == 2) { listenfd = tcp_listen(NULL, argv[1], NULL); } else if (argc == 3) { listenfd = tcp_listen(argv[1], argv[2], NULL); } else { printf("usage: tcprecv02 [ <host> ] <port#>\n"); exit(1); } if (setsockopt(listenfd, SOL_SOCKET, SO_OOBINLINE, &on, sizeof(on)) == -1) { err_exit("setsockopt error"); } if ((connfd = accept(listenfd, NULL, NULL)) == -1) { err_exit("accept error"); } sleep(5); for ( ; ; ) { if ((n = sockatmark(connfd)) == -1) { err_exit("sockatmark error"); } else if (n == 1) { printf("at OOB mark\n"); } if ((n = read(connfd, buff, sizeof(buff)-1)) < 0) { err_exit("read error"); } else if (n == 0) { printf("received EOF\n"); exit(0); } buff[n] = 0; /* null terminate */ printf("read %d bytes: %s\n", n, buff); }}
#include "err_exit.h"#include "tcp_connect.h"int main(int argc, char ** argv){ int sockfd; if (argc != 3) { printf("usage: tcpsend01 <host> <port#>\n"); exit(1); } sockfd = tcp_connect(argv[1], argv[2]); if (write(sockfd, "123", 3) != 3) { err_exit("write error"); } printf("wrote 3 bytes of normal data\n"); if (send(sockfd, "4", 1, MSG_OOB) != 1) { err_exit("send error"); } printf("wrote 1 byte of OOB data\n"); if (write(sockfd, "5", 1) != 1) { err_exit("write error"); } printf("wrote 1 bytes of normal data\n"); exit(0);}
#include "err_exit.h"#include "tcp_connect.h"int main(int argc, char ** argv){ int sockfd; if (argc != 3) { printf("usage: tcpsend01 <host> <port#>\n"); exit(1); } sockfd = tcp_connect(argv[1], argv[2]); if (write(sockfd, "123", 3) != 3) { err_exit("write error"); } printf("wrote 3 bytes of normal data\n"); sleep(1); if (send(sockfd, "4", 1, MSG_OOB) != 1) { err_exit("send error"); } printf("wrote 1 byte of OOB data\n"); sleep(1); if (write(sockfd, "5", 1) != 1) { err_exit("write error"); } printf("wrote 1 bytes of normal data\n"); sleep(1); if (send(sockfd, "6", 1, MSG_OOB) != 1) { err_exit("send error"); } printf("wrote 1 byte of OOB data\n"); sleep(1); if (write(sockfd, "7", 1) != 1) { err_exit("write error"); } printf("wrote 1 bytes of normal data\n"); sleep(1); exit(0);}
#include <fcntl.h>#include "err_exit.h"#include "my_signal.h"#include "tcp_listen.h"int listenfd;int connfd;void sig_urg(int signo){ int n; char buff[2048]; printf("SIGURG received\n"); if ((n = recv(connfd, buff, sizeof(buff)-1, MSG_OOB)) < 0) { err_exit("recv error"); } buff[n] = 0; /* null terminate */ printf("read %d OOB byte: %s\n", n, buff);}int main(int argc, char ** argv){ int size = 4096; if (argc == 2) { listenfd = tcp_listen(NULL, argv[1], NULL); } else if (argc == 3) { listenfd = tcp_listen(argv[1], argv[2], NULL); } else { printf("usage: tcprecv01 [ <host> ] <port#>\n"); } if (setsockopt(listenfd, SOL_SOCKET, SO_RCVBUF, &size, sizeof(size)) == -1) { err_exit("setsockopt error"); } if ((connfd = accept(listenfd, NULL, NULL)) == -1) { err_exit("accept error"); } if (my_signal(SIGURG, sig_urg) == SIG_ERR) { err_exit("my_signal error"); } if (fcntl(connfd, F_SETOWN, getpid()) == -1) { err_exit("fcntl error"); } for ( ; ; ) { pause(); }}
#include "err_exit.h"#include "tcp_connect.h"int main(int argc, char ** argv){ int sockfd; int size; char buff[16384]; if (argc != 3) { printf("usage: tcpsend01 <host> <port#>\n"); exit(1); } sockfd = tcp_connect(argv[1], argv[2]); size = 32768; if (setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &size, sizeof(size)) == -1) { err_exit("setsockopt error"); } if (write(sockfd, buff, 16384) != 16384) { err_exit("write error"); } printf("wrote 16384 bytes of normal data\n"); sleep(5); if (send(sockfd, "a", 1, MSG_OOB) != 1) { err_exit("send error"); } printf("wrote 1 byte of OOB data\n"); if (write(sockfd, buff, 1024) != 1024) { err_exit("write error"); } printf("wrote 1024 bytes of normal data\n"); exit(0);}
#include <fcntl.h>#include <sys/socket.h>#include "err_exit.h"#include "my_signal.h"static int servfd;static int nsec; /* seconds betweeen each alarm */static int maxnprobes; /* probes w/no response before quit */static int nprobes; /* probes since last server response */void sig_urg(int signo){ int n; char c; if ((n = recv(servfd, &c, 1, MSG_OOB)) < 0) { if (errno != EWOULDBLOCK) { err_exit("recv error"); } } nprobes = 0; /* reset counter */ return; /* may interrupt client code */}void sig_alrm(int signo){ if (++nprobes > maxnprobes) { fprintf(stderr, "server is unreachable\n"); exit(0); } if (send(servfd, "1", 1, MSG_OOB) != 1) { err_exit("send error"); } alarm(nsec); return; /* may interrupt client code */}void heartbeat_cli(int servfd_arg, int nsec_arg, int maxnprobes_arg){ servfd = servfd_arg; /* set globals for signal handlers */ if ((nsec = nsec_arg) < 1) { nsec = 1; } if ((maxnprobes = maxnprobes_arg) < nsec) { maxnprobes = nsec; } nprobes = 0; if (my_signal(SIGURG, sig_urg) == SIG_ERR) { err_exit("my_signal error"); } if (fcntl(servfd, F_SETOWN, getpid()) == -1) { err_exit("fcntl error"); } if (my_signal(SIGALRM, sig_alrm) == SIG_ERR) { err_exit("my_signal error"); } alarm(nsec);}
#include <fcntl.h>#include <sys/socket.h>#include "err_exit.h"#include "my_signal.h"static int servfd;static int nsec; /* seconds between each alarm */static int maxnalarms; /* alarms w/no client probe before quit */static int nprobes; /* alarms since last client probe */void sig_urg(int signo){ int n; char c; if ((n = recv(servfd, &c, 1, MSG_OOB)) < 0) { if (errno != EWOULDBLOCK) { err_exit("recv error"); } } if (send(servfd, &c, 1, MSG_OOB) != 1) { /* echo back out-of-band byte */ err_exit("send error"); } nprobes = 0; /* reset counter */ return; /* may interrupt server code */}void sig_alrm(int signo){ if (++nprobes > maxnalarms) { printf("no probes from client\n"); exit(0); } alarm(nsec); return; /* may interrupt server code */}voidheartbeat_serv(int servfd_arg, int nsec_arg, int maxnalarms_arg){ servfd = servfd_arg; /* set globals for signal handlers */ if ((nsec = nsec_arg) < 1) { nsec = 1; } if ((maxnalarms = maxnalarms_arg) < nsec) { maxnalarms = nsec; } nprobes = 0; if (my_signal(SIGURG, sig_urg) == SIG_ERR) { err_exit("my_signal error"); } if (fcntl(servfd, F_SETOWN, getpid()) == -1) { err_exit("fcntl error"); } if (my_signal(SIGALRM, sig_alrm) == SIG_ERR) { err_exit("my_signal error"); } alarm(nsec);}
- UNP函数笔记十四: 带外数据
- UNP Chapter 21 - 带外数据
- UNP函数笔记十六: 线程
- UNP函数笔记五: 套接字选项
- UNP函数笔记十二: Unix域协议
- unp 笔记
- UNP函数笔记十一: 高级I/O函数
- UNP笔记2——TCP套接口函数
- [UNP笔记]I/O复用,select和poll函数
- UNP函数笔记一: 套接字编程简介
- UNP函数笔记二: 基本TCP套接字编程
- UNP函数笔记三: TCP客户/服务器程序示例
- UNP函数笔记六: 基本UDP套接字编程
- UNP函数笔记七: 基本SCTP套接字编程
- UNP函数笔记八: 名字与地址转换
- UNP函数笔记九: IPv4与IPv6的互操作性
- UNP函数笔记十: 守护进程和inetd超级服务器
- UNP函数笔记十三: 非阻塞式I/O
- 计算机专业就业方向
- linux用户忘记密码怎么办
- “汉语编程”是解决安全问题的终极之路?
- oracle与mysql的区别
- IAP 详细总结
- UNP函数笔记十四: 带外数据
- 在Linux下面去压缩文件或者目录。我们将学习zip, tar, tar.gz和tar.bz2等压缩格式的基本用法
- 基于移动平台的多媒体框架——NDK编译ffmpeg超简单方法
- 【原创】Bigtable架构图
- 汉语编程毫无意义,低科学素养者盲目赞同
- 基于RGB描述的PCA局部人脸重建的实验与局限性
- USACO Training Section 1.2 Dual Palindromes 解题报告&AC代码
- linux进程状态浅析
- shell中的数据计算