OOB数据

 //send中最后一个参数:0、MSG_OOB、MSG_PEEK、MSG_DONTROUTE
    //        一般使用默认0
    //        MSG_OOB 优先数据 在linux中可以触发一个消息 无论发多长 优先数据只会是发的数据最后一个字节
    //        MSG_PEEK    标志会将套接字接收队列中的可读的数据拷贝到缓冲区,但不会使套接子接收队列中的数据减少,
    //        常见的是:例如调用recv或read后,导致套接字接收队列中的数据被读取后而减少,而指定了MSG_PEEK标志,可通过返回值获得可读数据长度,并且不会减少套接字接收缓冲区中的数据,
    //        所以可以供程序的其他部分继续读取。
    //        MSG_DONTROUTE 这个标志告诉IP.目的主机在本地网络上面,没有必要查找表.这个标志一般用网络诊断和路由程序里面.
    //        因为网络连接是现在主机找hosts再找arp缓存再在路由器上寻找 绕过这个流程直接发送

//recv    第四个参数
//        MSG_PEEK    标志会将套接字接收队列中的可读的数据拷贝到缓冲区,但不会使套接子接收队列中的数据减少,
//        常见的是:例如调用recv或read后,导致套接字接收队列中的数据被读取后而减少,而指定了MSG_PEEK标志,可通过返回值获得可读数据长度,并且不会减少套接字接收缓冲区中的数据,
//        所以可以供程序的其他部分继续读取。
//        MSG_DONTWAIT    仅本操作非阻塞
//        MSG_OOB 优先数据 在linux中可以触发一个消息 无论发多长 优先数据只会是发的数据最后一个字节
//        MSG_WAITALL 一直等待直到数据接收完毕

oob_c.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
main()
{
    int fd;
    int opt=1;
    char buf[100];
    int r;
    struct sockaddr_in dr;
    fd_set fds;
    
    fd=socket(PF_INET,SOCK_STREAM,0);
    if(fd==-1) printf("1:%m\n"),exit(-1);
    printf("1\n");
    dr.sin_family=AF_INET;
    dr.sin_port=htons(10000);    
    dr.sin_addr.s_addr=inet_addr("192.168.180.92");
    
    r=connect(fd,(struct sockaddr*)&dr,sizeof(dr));
    if(r==-1) printf("2:%m\n"),exit(-1);    
    while(1)
    {
        FD_ZERO(&fds);
        FD_SET(fd,&fds);
        select(fd+1,0,&fds,0,0);
        send(fd,"Hello",5,MSG_OOB);        
    }
    close(fd);
    
}

oob_s.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <signal.h>
#include <fcntl.h>
int fd,cfd;
void handle(int s)
{

    char data[100];
    int r;
    if(s==SIGURG)
    {
        r=recv(cfd,data,100,MSG_OOB);        
    
        data[r]=0;
        printf("$$%s\n",data);
    }
}
main()
{
    
    int opt=1;
    char buf[100];
    int r;
    struct sockaddr_in dr;
    
    fd=socket(PF_INET,SOCK_STREAM,0);
    if(fd==-1) printf("1:%m\n"),exit(-1);
    printf("1\n");
    dr.sin_family=AF_INET;
    dr.sin_port=htons(10000);    
    dr.sin_addr.s_addr=inet_addr("192.168.180.92");
    
    r=bind(fd,(struct sockaddr*)&dr,sizeof(dr));
    if(r==-1) printf("2:%m\n"),exit(-1);
    printf("2\n");
    r=listen(fd,10);
    if(r==-1) printf("3:%m\n"),exit(-1);
    printf("3\n");
    signal(SIGURG,handle);
    cfd=accept(fd,0,0);
    fcntl(cfd,F_SETOWN,getpid());
    if(cfd==-1) printf("4:%m\n"),exit(-1);
    printf("4\n");
    while(1)
    {
        r=recv(cfd,buf,100,0);
        if(r>0)
        {
            buf[r]=0;
            printf("接收数据:%s\n",buf);
        }        
        else
        {
            break;
        }        
    }
    close(cfd);
    close(fd);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值