代码:
#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
从运行结果可以看出:每次打印的信息都是收到的最新的数据,而不必从缓冲区依次读。