Linux下同时接受普通数据和带外数据

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <assert.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <fcntl.h>
#include <stdlib.h>

int main()
{
    const char *ip="127.0.0.1";
    int port=12345;
    int ret=0;
    struct sockaddr_in address;
    bzero(&address,sizeof(address));
    address.sin_family=AF_INET;
    inet_pton(AF_INET,ip,&address.sin_addr);
    address.sin_port=htons(port);

    int listenfd=socket(PF_INET,SOCK_STREAM,0);
    assert(listenfd>=0);
    ret=bind(listenfd,(struct sockaddr *)&address,sizeof(address));
    assert(ret!=-1);
    ret=listen(listenfd,5);
    assert(ret!=-1);

    struct sockaddr_in client_address;
    socklen_t client_addrlength=sizeof(client_address);
    int connfd=accept(listenfd,(struct sockaddr *)&client_address,&client_addrlength);
    if(connfd<0)
    {
        printf("Errno is :%d\n",errno);
        close(listenfd);
    }
    char buf[1024];
    fd_set read_fds;
    fd_set exception_fds;
    FD_ZERO(&read_fds);
    FD_ZERO(&exception_fds);
    while(1)
    {
        memset(buf,'\0',sizeof(buf));
        FD_SET(connfd,&read_fds);
        FD_SET(connfd,&exception_fds);
        ret=select(connfd+1,&read_fds,NULL,&exception_fds,NULL);
        if(ret<0)
        {
            printf("selection failure");
            break;
        }
        if(FD_ISSET(connfd,&read_fds))
        {
            ret=recv(connfd,buf,sizeof(buf)-1,0);
            if(ret<=0)
            {
                break;
            }
            printf("get %d bytes of normal data:%s\n",ret,buf);
        }
        else if(FD_ISSET(connfd,&exception_fds))
        {
            ret=recv(connfd,buf,sizeof(buf)-1,MSG_OOB);
            if(ret<=0)
            {
                break;
            }
            printf("get %d bytes of oob data:%s\n",ret,buf);
        }
    }
    close(connfd);
    close(listenfd);
    return 0;
}

时间: 2024-10-30 08:46:18

Linux下同时接受普通数据和带外数据的相关文章

《网络编程》带外数据

带外数据 有些传输层协议具有带外(Out Of Band,OOB)数据的概念,用于迅速通告对端本端所发生的重要事件.因此,带外数据比普通数据(也称为带内数据)有更高的优先级,它应该总是立即被发送,而不论发送缓冲区中是否有排队等待发送的普通数据或因流量控制而导致发送端的通告窗口大小为 0(即停止发送数据) .带外数据的传输可以使用一条独立的传输层连接,也可以映射到传输普通数据的连接中. UDP 没有实现带外数据传输,TCP 也没有真正的带外数据.只不过 TCP 利用其首部中的 紧急指针标志 和 紧

TCP带外数据

传输层协议使用带外数据(out-of-band,OOB)来发送一些重要的数据,如果通信一方有重要的数据需要通知对方时,协议能够将这些数据快速地发送到对方.为了发送这些数据,协议一般不使用与普通数据相同的通道,而是使用另外的通道.linux系统的套接字机制支持低层协议发送和接受带外数据.但是TCP协议没有真正意义上的带外数据.为了发送重要协议,TCP提供了一种称为紧急模式(urgentmode)的机制.TCP协议在数据段中设置URG位,表示进入紧急模式.接收方可以对紧急模式采取特殊的处理.很容易看

TCP带外数据(URG,MSG_OOB)

前言: blog原文地址:http://blog.csdn.net/ordeder/article/details/43243425 本文系读书笔记,主要参考材料:http://wenku.baidu.com/view/f04a4dff9e31433239689341.html TCP的带外数据: 头部标志: URG位,紧急指针. 数据包中:一个紧急指针只指向一个字节的带外数据的后已字节位置.紧急数据时插在正常数据流中进行传输.紧急指针用于指出带外数据字节在正常字节流中的位置. 问题:为何不直接

TCP带外数据学习总结(概念,发送接收过程,数据到达检测,代码实现)

最近在学习<Linux高性能服务器编程> 这本书,书中零零散散的讲了TCP带外数据的一些知识,在这里把这些知识总结以下,方便自己,也方便他人. 本文主要分为以下四个方面总结,分别为 TCP带外数据的概念,如何发送和接收带外数据,怎么检测带外数据的到达,最后介绍相关函数以及代码实现. 第一部分: TCP带外数据的概念 有很多传输层此协议都具有带外数据(OUT Of Band) 的概念,其作用是迅速通告通信的另一方本段发生的重要事件.带外数据具有比普通数据更高的优先级,理论上应该被立即发送和立即接

Linux下rsync的安装与配置远程服务器数据同步

服务器里数据最重要,商业用途的数据更加重要,一旦丢失,结果不堪设想.所以备份很重要.可以使用来rsync+crontab来做数据同步. 方法/步骤 首先是安装 wget http://rsync.samba.org/ftp/rsync/src/rsync-3.1.0.tar.gz cd rsync-3.1.0/ ./configure --prefix=/usr/local/rsync make make install 测试下 make test 没问题 下面开始配置,注意默认是没有rsync

Linux下使用curl get请求 参数带[]的情况

正常情况: curl 'http://xxxx.xxxx.xxxx.xxxx:8080/assetservice/getXXX?参数1=xxxx&参数2=xxxx' 如果有两个参数,url 必须用单引号括起来,否则读不到第二个参数. 如果参数带有[]或者是特殊字符,即参数2=[20180101],如果正常情况下显示不出来 python -c "import urllib as u; print u.urlopen('http://xxxx.xxxx.xxxx.xxxx:8080/asse

TCP带外数据读写

#include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <assert.h> #include <stdio.h> #include <unistd.h> #include <string.h> #include <stdlib.h> int main( int argc, char* argv[] ) {

Linux下异常信号

我们介绍一些标准信号的名称以及它们代表的事件.每一个信号名称是一个代表正整数的宏,但是你不要试图去推测宏代表的具体数值,而是直接使用名称.这是因为这个数值会随不同的系统或同样系统的不同版本而不同,但是名称还算是标准化和统一的.    这些名称定义在signal.h中.    int NSIG是一个定义的宏,它描述了定义的信号的数量.由于信号的数值是从0开始连续分配的,所以,NSIG比系统中所定义的最大的信号数值大1. 11.2.1 程序出错信号    下面介绍的信号是有程序的错误造成的.这些严重

Linux下getsockopt/setsockopt 函数说明

[ getsockopt/setsockopt系统调用 功能描述:  获取或者设置与某个套接字关联的选 项.选项可能存在于多层协议中,它们总会出现在最上面的套接字层.当操作套接字选项时,选项位于的层和选项的名称必须给出.为了操作套接字层的选项,应该 将层的值指定为SOL_SOCKET.为了操作其它层的选项,控制选项的合适协议号必须给出.例如,为了表示一个选项由TCP协议解析,层应该设定为协议 号TCP. 用法:  #include #include int getsockopt(int sock