//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);
}