0
UDP 멀티 캐스트 패킷을 수신하기 위해 C 프로그램을 작성하고 작동합니다. 그러나 프로그램이 몇 초 동안 작동하면 패킷 손실이 자주 발생합니다. Ctrl + C를 눌러 프로그램을 종료하고 다시 시작하면 대부분의 패킷이 수신되지만 손실 된 패킷은 몇 초 후에 발생합니다. 이것은 매우 이상합니다. 무엇이 문제입니까? 여기 내 C 코드입니다.C UDP 멀티 캐스트 수신 패킷 손실
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <android/log.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/resource.h>
#define BUF_SIZE 4
int mjpeg_main(){
int sockfd;
struct sockaddr_in localSock;
struct ip_mreq group;
char buf[BUF_SIZE];
int len = sizeof(localSock);
/* Create a datagram socket on which to receive. */
if((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
{
perror("Can't create socket!");
exit(1);
}
/* Enable SO_REUSEADDR to allow multiple instances of this */
/* application to receive copies of the multicast datagrams. */
int reuse = 1;
if(setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse, sizeof(reuse)) < 0)
{
perror("Setting SO_REUSEADDR error");
close(sockfd);
exit(1);
}
int n = 1024 * 1024;
if (setsockopt(sockfd,SOL_SOCKET,SO_RCVBUFFORCE,(const char*)&n, sizeof(int)) == -1)
{
// deal with failure, or ignore if you can live with the default size
}
/* Bind to the proper port number with the IP address */
/* specified as INADDR_ANY. */
memset((char *) &localSock, 0, sizeof(localSock));
localSock.sin_family = AF_INET;
localSock.sin_port = htons(2068);
localSock.sin_addr.s_addr = INADDR_ANY;
if(bind(sockfd, (struct sockaddr*)&localSock, sizeof(localSock)))
{
perror("Binding datagram socket error");
close(sockfd);
exit(1);
}
/* Join the multicast group 239.100.15.101 on the local 203.106.93.94 */
/* interface. Note that this IP_ADD_MEMBERSHIP option must be */
/* called for each local interface over which the multicast */
/* datagrams are to be received. */
group.imr_multiaddr.s_addr = inet_addr("239.100.15.101");
group.imr_interface.s_addr = inet_addr("10.100.15.115");
if(setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&group, sizeof(group)) < 0)
{
perror("Adding multicast group error");
close(sockfd);
exit(1);
}
printf("Start to receive!n");
__android_log_print(ANDROID_LOG_INFO,"mjpeg","mjpeg start !!");
//Wait for connect
while(1)
{
memset(buf, 0, sizeof(buf));
int z = recvfrom(sockfd, // Socket
buf, // Receiving buffer
sizeof buf, // Max recv buf size
0, // Flags: no options
(struct sockaddr *)&localSock,// Addr
&len); // Addr len, in & out
if (z < 0)
{
perror("recv");
exit(1);
}
printf("Frame: %02X:%02X, Sequence: %02X:%02X\n", buf[0], buf[1], buf[2], buf[3]);
}
close(sockfd);
return 0;
}
그리고 이것은 결과입니다. 보낸 사람은 하드웨어이고 프레임에는 많은 시퀀스가 들어 있습니다. 순번이 순차적으로 증가합니다.
Frame: 09:1F, Sequence: 00:00 Frame: 09:1F, Sequence: 00:01 Frame: 09:1F, Sequence: 00:02 Frame: 09:1F, Sequence: 00:03 Frame: 09:1F, Sequence: 00:04 Frame: 09:1F, Sequence: 00:05 Frame: 09:1F, Sequence: 00:06 Frame: 09:1F, Sequence: 00:07 Frame: 09:1F, Sequence: 00:08 Frame: 09:1F, Sequence: 00:09 Frame: 09:1F, Sequence: 00:0A Frame: 09:1F, Sequence: 00:0B Frame: 09:1F, Sequence: 00:0C Frame: 09:1F, Sequence: 00:0D Frame: 09:1F, Sequence: 00:0E Frame: 09:1F, Sequence: 00:0F Frame: 09:1F, Sequence: 00:10 Frame: 09:1F, Sequence: 00:11 Frame: 09:1F, Sequence: 00:12 Frame: 09:1F, Sequence: 00:13 Frame: 09:1F, Sequence: 00:14 Frame: 09:1F, Sequence: 00:15 Frame: 09:1F, Sequence: 00:16 Frame: 09:1F, Sequence: 00:17 Frame: 09:1F, Sequence: 00:18 Frame: 09:1F, Sequence: 00:19 Frame: 09:1F, Sequence: 00:1A Frame: 09:1F, Sequence: 00:1B Frame: 09:1F, Sequence: 00:1C Frame: 09:1F, Sequence: 00:1D Frame: 09:1F, Sequence: 00:1E Frame: 09:1F, Sequence: 00:1F Frame: 09:1F, Sequence: 00:20 Frame: 09:1F, Sequence: 00:21 Frame: 09:1F, Sequence: 00:22 Frame: 09:1F, Sequence: 00:23 Frame: 09:1F, Sequence: 00:24 Frame: 09:1F, Sequence: 00:25 Frame: 09:1F, Sequence: 00:26 Frame: 09:1F, Sequence: 00:27 Frame: 09:1F, Sequence: 00:28 Frame: 09:1F, Sequence: 00:29 Frame: 09:1F, Sequence: 00:2A Frame: 09:1F, Sequence: 00:2B Frame: 09:1F, Sequence: 00:2C Frame: 09:1F, Sequence: 00:2D Frame: 09:1F, Sequence: 00:2E Frame: 09:1F, Sequence: 00:2F Frame: 09:1F, Sequence: 00:30 Frame: 09:1F, Sequence: 00:31 Frame: 09:1F, Sequence: 00:32 Frame: 09:1F, Sequence: 00:33 Frame: 09:1F, Sequence: 00:34 Frame: 09:1F, Sequence: 00:35 Frame: 09:1F, Sequence: 00:36 Frame: 09:1F, Sequence: 00:37 Frame: 09:1F, Sequence: 00:38 Frame: 09:1F, Sequence: 00:39 Frame: 09:1F, Sequence: 00:3A Frame: 09:1F, Sequence: 00:3B Frame: 09:1F, Sequence: 00:3C Frame: 09:1F, Sequence: 00:3D Frame: 09:1F, Sequence: 00:3E Frame: 09:1F, Sequence: 00:3F Frame: 09:1F, Sequence: 00:40 Frame: 09:1F, Sequence: 00:41 Frame: 09:1F, Sequence: 00:42 Frame: 09:1F, Sequence: 00:43 Frame: 09:1F, Sequence: 00:44 Frame: 09:1F, Sequence: 00:45 Frame: 09:1F, Sequence: 00:46 Frame: 09:1F, Sequence: 00:47 Frame: 09:1F, Sequence: 00:48 Frame: 09:1F, Sequence: 00:49 Frame: 09:1F, Sequence: 00:4A Frame: 09:1F, Sequence: 00:4B Frame: 09:1F, Sequence: 00:4C Frame: 09:1F, Sequence: 00:4D Frame: 09:1F, Sequence: 80:4E Frame: 09:20, Sequence: 00:00 Frame: 09:20, Sequence: 00:01 Frame: 09:20, Sequence: 00:02 Frame: 09:20, Sequence: 00:03 Frame: 09:20, Sequence: 00:04 Frame: 09:20, Sequence: 00:05 Frame: 09:20, Sequence: 00:06 Frame: 09:20, Sequence: 00:07 Frame: 09:20, Sequence: 00:08 Frame: 09:20, Sequence: 00:09 Frame: 09:20, Sequence: 00:0A Frame: 09:20, Sequence: 00:0B Frame: 09:20, Sequence: 00:0C Frame: 09:20, Sequence: 00:0D Frame: 09:20, Sequence: 00:0E Frame: 09:20, Sequence: 00:0F Frame: 09:20, Sequence: 00:10 Frame: 09:20, Sequence: 00:11 Frame: 09:20, Sequence: 00:12 Frame: 09:20, Sequence: 00:13 Frame: 09:20, Sequence: 00:14 Frame: 09:20, Sequence: 00:15 Frame: 09:20, Sequence: 00:16 Frame: 09:20, Sequence: 00:17 Frame: 09:20, Sequence: 00:18 Frame: 09:20, Sequence: 00:19 Frame: 09:20, Sequence: 00:1A Frame: 09:20, Sequence: 00:1B Frame: 09:20, Sequence: 00:1C Frame: 09:20, Sequence: 00:1D Frame: 09:20, Sequence: 00:1E Frame: 09:20, Sequence: 00:1F Frame: 09:20, Sequence: 00:20 Frame: 09:20, Sequence: 00:21 Frame: 09:20, Sequence: 00:22 Frame: 09:20, Sequence: 00:23 Frame: 09:20, Sequence: 00:24 Frame: 09:20, Sequence: 00:25 Frame: 09:20, Sequence: 00:26 Frame: 09:20, Sequence: 00:27 Frame: 09:20, Sequence: 00:28 Frame: 09:20, Sequence: 00:29 Frame: 09:20, Sequence: 00:2E Frame: 09:20, Sequence: 00:31 Frame: 09:20, Sequence: 00:37 Frame: 09:20, Sequence: 00:3B Frame: 09:20, Sequence: 00:3D Frame: 09:20, Sequence: 00:3F Frame: 09:20, Sequence: 00:41 Frame: 09:20, Sequence: 00:42 Frame: 09:20, Sequence: 00:44 Frame: 09:20, Sequence: 00:46 Frame: 09:20, Sequence: 00:4B Frame: 09:20, Sequence: 80:4E Frame: 09:21, Sequence: 00:00 Frame: 09:21, Sequence: 00:01 start packet lost... Frame: 09:21, Sequence: 00:06 Frame: 09:21, Sequence: 00:10 Frame: 09:21, Sequence: 00:1C Frame: 09:21, Sequence: 00:25 Frame: 09:21, Sequence: 00:2F Frame: 09:21, Sequence: 00:35 Frame: 09:21, Sequence: 00:3B Frame: 09:21, Sequence: 00:3C Frame: 09:21, Sequence: 00:3E Frame: 09:21, Sequence: 00:40 Frame: 09:21, Sequence: 00:42 Frame: 09:21, Sequence: 00:43 Frame: 09:21, Sequence: 00:45 Frame: 09:21, Sequence: 00:47 Frame: 09:21, Sequence: 00:4D Frame: 09:22, Sequence: 00:01 Frame: 09:22, Sequence: 00:05 Frame: 09:22, Sequence: 00:0D Frame: 09:22, Sequence: 00:1B Frame: 09:22, Sequence: 00:23 Frame: 09:22, Sequence: 00:2F Frame: 09:22, Sequence: 00:34 Frame: 09:22, Sequence: 00:3A Frame: 09:22, Sequence: 00:3C Frame: 09:22, Sequence: 00:3E Frame: 09:22, Sequence: 00:40 Frame: 09:22, Sequence: 00:41 Frame: 09:22, Sequence: 00:43 Frame: 09:22, Sequence: 00:45 Frame: 09:22, Sequence: 00:47 Frame: 09:22, Sequence: 00:4D Frame: 09:23, Sequence: 00:01 Frame: 09:23, Sequence: 00:04 Frame: 09:23, Sequence: 00:0A Frame: 09:23, Sequence: 00:19 Frame: 09:23, Sequence: 00:20 Frame: 09:23, Sequence: 00:2E Frame: 09:23, Sequence: 00:32 Frame: 09:23, Sequence: 00:39 Frame: 09:23, Sequence: 00:3C Frame: 09:23, Sequence: 00:3E Frame: 09:23, Sequence: 00:3F Frame: 09:23, Sequence: 00:41 Frame: 09:23, Sequence: 00:43 Frame: 09:23, Sequence: 00:45 Frame: 09:23, Sequence: 00:46 Frame: 09:23, Sequence: 00:4D
왜 안되나요? UDP는 신뢰할 수없는 프로토콜이거나 안정성 기능이 없습니다. – EJP
예, 알고 있습니다.이 상황을 줄이려면 어떤 방법이 있습니까? 패킷 손실 정도가 너무 심각합니다. – Andy
덜 바쁜 네트워크를 사용하거나 속도를 높이는 것 외에는 할 수있는 일은 많지 않습니다. 예를 들어,'memset()'호출은 필요 없다. 물론 인쇄로 느려지 게됩니다. – EJP