通过设置套接字阻塞与非阻塞使UDP 接收到的数据始终为最新的数据

代码:

#include"common.h"
int fd;
int abc = 1000;
struct sockaddr_in caddr;
int addr_len;

static void setnonblocking(int sockfd) {         //设置阻塞
    int flag = fcntl(sockfd, F_GETFL, 0);
    if (flag < 0) {
        perror("fcntl F_GETFL fail");
        return;
    }
    if (fcntl(sockfd, F_SETFL, flag | O_NONBLOCK) < 0) {   
        perror("fcntl F_SETFL fail");
    }

}

static void setblocking(int sockfd) {    //设置非阻塞
   int  flags = fcntl(sockfd,F_GETFL,0);
    if (flags< 0) {
        perror("fcntl F_GETFL fail");
        return;
    }
    if (fcntl(sockfd,F_SETFL,flags&~O_NONBLOCK)< 0) {
        perror("fcntl F_SETFL fail");
    }

}

int main()
{
		
		int ret;
	
		struct sockaddr_in saddr;
		char buf[1024];

		fd=socket(AF_INET,SOCK_DGRAM,0);
		if(fd<0)
		{
				perror("socket");
		}
		saddr.sin_family=AF_INET;
		saddr.sin_port=htons(9000);
		inet_pton(AF_INET,"127.0.0.1",&saddr.sin_addr.s_addr);

		ret=bind(fd,(struct sockaddr*)&saddr,sizeof(saddr));

		if (ret<0)
		{
				perror("bind");
		}

		addr_len=sizeof(caddr);
		
	
		while(1)
		{

			setblocking(fd); //设置阻塞
				ret=recvfrom(fd,&abc,4,0,(struct sockaddr*)&caddr,&addr_len);				
				
				setnonblocking(fd); //设置非阻塞
				while(1){

					ret=recvfrom(fd,&abc,4,0,(struct sockaddr*)&caddr,&addr_len);
					if(ret==-1)break;


				}

				printf("recv:%d\n",abc);
				sleep(1);
				

		}
	

		close(fd);
		return 0;
}

测试代码:

#include"common.h"

int main()
{
		int fd;int saddr_len;
		int ret;
		char buf[1024];
		struct sockaddr_in saddr;

		fd = socket(AF_INET, SOCK_DGRAM, 0);
		if(fd < 0)
		{
				printf("create socket fail!\n");
				return -1;
		}

		saddr.sin_family=AF_INET;
		saddr.sin_port=htons(9000);
		inet_pton(AF_INET,"127.0.0.1",&saddr.sin_addr.s_addr);
	int i =10;

		while(1)
		{
		
				ret=sendto(fd,&i,4,0,(struct sockaddr*)&saddr,sizeof(saddr));
			printf("have sended:%d\n",i);
			
			if(i==30000000)break;
			if(i%3==0)usleep(500);
		
			i++;
		}

		close(fd);

		return 0;
}

结果:

recv:6159
recv:6437
recv:12159
recv:15162
recv:18159
recv:21168
recv:21446
recv:24458
recv:27458
 

从运行结果可以看出:每次打印的信息都是收到的最新的数据,而不必从缓冲区依次读。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值