C mall延迟不会导致数据包丢失。你只对最近的一段感兴趣吗?鉴于你上面发布的代码,我看不出你会执行sleep。您设置了g=0。然后,在循环中,您有一条语句:if(g==10),它保护您的睡眠。但是,g永远不会被修改,所以块永远不会被输入。在任何情况下,您都无
C mall延迟不会导致数据包丢失。你只对最近的一段感兴趣吗?鉴于你上面发布的代码,我看不出你会执行sleep。您设置了g=0。然后,在循环中,您有一条语句:if(g==10),它保护您的睡眠。但是,g永远不会被修改,所以块永远不会被输入。在任何情况下,您都无,c,sockets,udp,broadcast,fifo,C,Sockets,Udp,Broadcast,Fifo,mall延迟不会导致数据包丢失。你只对最近的一段感兴趣吗?鉴于你上面发布的代码,我看不出你会执行sleep。您设置了g=0。然后,在循环中,您有一条语句:if(g==10),它保护您的睡眠。但是,g永远不会被修改,所以块永远不会被输入。在任何情况下,您都无法通过UDP从一个recvfrom获取多个数据报。所以不清楚你所说的“10流合1”是什么意思。正如@dbush所说,如果在数据报到达时您一直在睡觉,您很可能会在短时间内收到10个单独的排队数据报。@dbush事实就是这样!是的,我不想阅读在睡眠
mall延迟不会导致数据包丢失。你只对最近的一段感兴趣吗?鉴于你上面发布的代码,我看不出你会执行
sleep
。您设置了g=0
。然后,在循环中,您有一条语句:if(g==10)
,它保护您的睡眠。但是,g
永远不会被修改,所以块永远不会被输入。在任何情况下,您都无法通过UDP从一个recvfrom
获取多个数据报。所以不清楚你所说的“10流合1”是什么意思。正如@dbush所说,如果在数据报到达时您一直在睡觉,您很可能会在短时间内收到10个单独的排队数据报。@dbush事实就是这样!是的,我不想阅读在睡眠时间发送的数据包,只有最近的。。。我不知道linux操作系统有一个小的缓冲区,我怎么才能只得到最后一个呢?谢谢你@吉尔汉密尔顿在我睡觉的时候,我的设备每秒钟都会发送大小为58的数据包。所以我睡10秒钟,它会发送10个我不会读的数据包。在第11秒我读了数据包,我只想读第11个,但我读了10个数据包+11个。。。对不起,我看得不够清楚。。。那么我如何摆脱这个“缓冲区”?非常感谢。
#include <stdio.h> /* for printf() and fprintf() */
#include <sys/socket.h> /* for socket(), connect(), sendto(), and recvfrom() */
#include <arpa/inet.h> /* for sockaddr_in and inet_addr() */
#include <stdlib.h> /* for atoi() and exit() */
#include <string.h> /* for memset() */
#include <unistd.h> /* for close() */
#define MAXRECVSTRING 58 /* Longest string to receive */
int main(int argc, char *argv[])
{
int sock; /* Socket */
struct sockaddr_in broadcastAddr; /* Broadcast Address */
unsigned short broadcastPort; /* Port */
char recvString[MAXRECVSTRING+1]; /* Buffer for received string */
int recvStringLen; /* Length of received string */
if (argc != 2) /* Test for correct number of arguments */
{
fprintf(stderr,"Usage: %s <Broadcast Port>\n", argv[0]);
exit(1);
}
broadcastPort = atoi(argv[1]); /* First arg: broadcast port */
/* Create a best-effort datagram socket using UDP */
if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
perror("socket() failed");
/* Construct bind structure */
memset(&broadcastAddr, 0, sizeof(broadcastAddr)); /* Zero out structure */
broadcastAddr.sin_family = AF_INET; /* Internet address family */
broadcastAddr.sin_addr.s_addr = htonl(INADDR_ANY); /* Any incoming interface */
broadcastAddr.sin_port = htons(broadcastPort); /* Broadcast port */
/* Bind to the broadcast port */
if (bind(sock, (struct sockaddr *) &broadcastAddr, sizeof(broadcastAddr)) < 0)
perror("bind() failed");
/* Receive datagram from the server */
int g=0;
int time_to_sleep=10;
while(1)
{
if(g==10)
{
while(time_to_sleep)
{
printf("sleep for %d\n", time_to_sleep);
time_to_sleep=sleep(time_to_sleep);
}//after that my next read is 10 data stream of 58 in one !!
}
if ((recvStringLen = recvfrom(sock, recvString, MAXRECVSTRING, 0, NULL, 0)) < 0)
{
perror("recvfrom() failed");
}
//later will check the header but for now just the size is enough
if (recvStringLen==58){ printf("Read okay bc Size = %d \n", recvStringLen); }
}
close(sock);
exit(0);
}
int fd_flag;
if ((fdflag = fcntl(sock, F_GETFL)) == -1) {
perror("Error getting socket descriptor flags");
exit(1);
}
fdflag |= O_NONBLOCK;
if (fcntl(sock, F_SETFL, fdflag) == -1) {
perror("Error setting non-blocking option");
exit(1);
}
while(1)
{
while(time_to_sleep)
{
printf("sleep for %d\n", time_to_sleep);
time_to_sleep=sleep(time_to_sleep);
}//after that my next read is 10 data stream of 58 in one !!
int read_one = 0;
while (1) {
if ((recvStringLen = recvfrom(sock, recvString, MAXRECVSTRING, 0, NULL, 0)) < 0)
{
if (errno == EAGAIN) {
// nothing more to read
break;
} else {
perror("recvfrom() failed");
}
} else {
read_one = 1;
if (recvStringLen==58){ printf("Read okay bc Size = %d \n", recvStringLen); }
}
}
if (read_one) {
// process last packet read
} else {
// nothing read, so do nothing
}
}