⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 p12-22.c

📁 SUN Solaris8平台下进程间通信
💻 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 + -