📄 p12-22.c
字号:
#include <unistd.h>#include <sys/socket.h>#include <stdio.h>#include "err_exit.h"struct buffer{ char *buffer; /* 存放数据的缓冲区 */ int size; /* 数据大小 */ struct buffer *next; /* 下一块数据缓冲区指针 */};struct buffer* read_oob (int socket) { struct buffer *tail = NULL; struct buffer *list = NULL; while (1) { char *buff = (char *) xmalloc(1024); struct buffer *link; int success; int result; /* 尝试读带外数据 */ success = recv(socket, buff, sizeof(buff), MSG_OOB); if (success >= 0) { /* 已成功读到,将它返回 */ struct buffer *link = (struct buffer *) xmalloc (sizeof (struct buffer)); link->buffer = buff; link->size = success; link->next = list; return link; } if (errno != EAGAIN) err_exit("recv error"); /* 若失败且为EAGAIN错误,查看是否位于带外数据标志处 */ success = sockatmark(socket); if (success < 0) printf ("sockatmark error\n"); if (success) { /* 位于标志处,无需再读普通数据,等待一会儿 */ sleep (1); continue; } /* 否则,读普通数据并保存它。如果普通数据在该标志之前,这保证不会读过标志*/ success = read (socket, buff, sizeof(buff)); if (success < 0) perror ("read"); /* 保存这块数据至缓冲区链表 */ { struct buffer *link = (struct buffer *)xmalloc(sizeof(struct buffer)); link->buffer = buff; link->size = success; /* 加至链尾 */ if (tail) tail->next = link; else list = link; tail = link; } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -