简体   繁体   English

C UDP组播接收数据包丢失

[英]C UDP Multicast receive packet lost

I write a C program to receive UDP multicast packets, and it works. 我编写了一个C程序来接收UDP多播数据包,并且它可以正常工作。 However, when the program running few seconds, the packet lost happens frequently. 但是,当程序运行几秒钟时,数据包丢失经常发生。 When I press the Ctrl + C to terminate the program and restart it, it will receive most of the packets, but the packet lost will be happened after few seconds. 当我按Ctrl + C终止程序并重新启动它时,它将接收大多数数据包,但是丢失数据包将在几秒钟后发生。 This is very strange, what's the problem? 这很奇怪,怎么了? Here is my C code. 这是我的C代码。

#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;
}

And, this is the result. 而且,这就是结果。 The sender is a hardware, a frame contains many sequences. 发送者是硬件,一个帧包含许多序列。 The sequence number will sequentially increase. 序列号将顺序增加。

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

The problem was solved. 问题解决了。 The reason is that our PHY is using external crystal, and the configuration of clock of the kernel is incorrect. 原因是我们的PHY使用的是外部晶振,内核时钟的配置不正确。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM