在同一端口上接收多个组播源 – C,Linux

我有一个应用程序从同一端口上的多个组播源接收数据。 我能够收到数据。 但是,我试图考虑每个组的统计信息(即收到的消息,收到的字节数),并且所有数据都混淆了。 有谁知道如何解决这个问题? 如果我试着查看发件人的地址,那么它不是多播地址,而是发送机器的IP。 我使用以下套接字选项: struct ip_mreq mreq; mreq.imr_multiaddr.s_addr = inet_addr(“224.1.2.3”); mreq.imr_interface.s_addr = INADDR_ANY; setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)); 并且: setsockopt(s, SOL_SOCKET, SO_REUSEPORT, &reuse, sizeof(reuse));

宏值的字符串化

我遇到了一个问题 – 我需要使用宏值作为字符串和整数。 #define RECORDS_PER_PAGE 10 /*… */ #define REQUEST_RECORDS \ “SELECT Fields FROM Table WHERE Conditions” \ ” OFFSET %d * ” #RECORDS_PER_PAGE \ ” LIMIT ” #RECORDS_PER_PAGE “;” char result_buffer[RECORDS_PER_PAGE][MAX_RECORD_LEN]; /* …and some more uses of RECORDS_PER_PAGE, elsewhere… */ 这失败了一条关于“stray#”的消息,即使它有效,我想我会得到字符串化的宏名称,而不是值。 当然,我可以将值提供给最终方法( “LIMIT %d “, page*RECORDS_PER_PAGE ),但它既不漂亮也不高效。 当我希望预处理器不以特殊方式处理字符串并且像普通代码一样处理它们的内容时,就像这样。 现在,我用#define RECORDS_PER_PAGE_TXT “10”表达它,但可以理解的是,我对它并不满意。 如何做到对了?

如何在ARM Cortex-A8处理器中测量程序执行时间?

我正在使用一个名为i.MX515的基于ARM Cortex-A8的处理器。 有Linux Ubuntu 9.10发行版。 我正在运行一个用C编写的非常大的应用程序,我正在使用gettimeofday(); 用于衡量我的应用程序所用时间的函数。 main() { gettimeofday(start); …. …. …. gettimeofday(end); } 这种方法足以让我看看我的应用程序块占用了多少时间。 但是,现在,我正在尝试使用gettimeofday()计算时间的方法彻底优化我的代码,我看到连续运行之间有很多波动(在我的优化之前和之后运行),所以我不能确定实际执行时间,从而影响我的改进。 谁能告诉我应该怎么做? 如果通过访问循环计数器( ARM网站上为Cortex-M3建议的想法 ),任何人都可以向我指出一些代码,它给出了我在Cortex-A8上访问定时器寄存器时必须遵循的步骤吗? 如果这种方法不是很准确,那么请提出一些替代方案。 谢谢 跟进 跟进1:在Code Sorcery上编写了以下程序,生成了可执行文件,当我尝试在主板上运行时,我得到了 – 非法指令消息:( static inline unsigned int get_cyclecount (void) { unsigned int value; // Read CCNT Register asm volatile (“MRC p15, 0, %0, c9, c13, 0\t\n”: “=r”(value)); return value; } […]

C中的数组增量运算符

我不明白以下代码的结果: #include #include int main() { int a[4]={1, 3, 5, 6}; //suppose a is stored at location 2010 printf(“%d\n”, a + 2); printf(“%d”, a++); return 0; } 为什么第二个printf函数会产生以下错误? error: lvalue required as increment operand

为什么我需要使用类型**指向类型*?

几天来,我一直在阅读“学习艰难的道路”,但这是我想要真正理解的东西。 作者Zed写道, char **用于指向(指向char的指针),并说这是必需的,因为我试图指向二维的东西。 这是在网页上写的内容 char *已经是“指向char的指针”,所以这只是一个字符串。 但是你需要2个级别,因为名称是2维的,这意味着你需要char **作为“指向(指向char的指针)”类型。 这是否意味着我必须使用一个可以指向二维的变量,这就是为什么我需要两个** ? 只是一点点跟进,这也适用于n维吗? 这是相关的代码 char *names[] = { “Alan”, “Frank”, “Mary”, “John”, “Lisa” }; char **cur_name = names;

如何使用正确的参数调用C中的execl()?

如果我输入一个shell,我有vlc(重现video的程序): / home / vlc“/ home / my movies /我想看的电影.mkv” 它打开了一个再现电影。 但是,当我运行以下程序时: #include int main(void) { execl(“/home/vlc”, “/home/my movies/the movie i want to see.mkv”,NULL); return 0; } vlc打开但不会重现任何内容。 我怎么解决这个问题? 我试过的事情: 我猜的 execl(“/home/vlc”, “/home/my movies/the movie i want to see.mkv”,NULL); 相当于在shell中输入: /home/vlc /home/my movies/the movie i want to see.mkv 这不起作用,所以我试过 execl(“/home/vlc”, “\”/home/my movies/the movie i want […]

序列点在c

命令式编程中的序列点定义了计算机程序执行中的任何点,在该点处保证先前评估的所有副作用都将被执行,并且尚未执行后续评估的副作用。 这是什么意思? 有人可以用简单的语言解释一下吗?

从main调用pthread_exit可以吗?

当我从main调用pthread_exit时,程序永远不会终止。 我期望程序完成,因为我退出程序的唯一线程,但它不起作用。 好像挂了。 #include #include #include int main(int argc, char *argv[]) { printf(“-one-\n”); pthread_exit(NULL); printf(“-two-\n”); } Process Explorer显示(仅)线程处于Wait:DelayExecution状态。 根据pthread_exit文档: 在最后一个线程终止后,进程将以退出状态0退出。 行为应该就像实现在线程终止时调用带有零参数的exit()一样。 我正在使用Dev-C ++ v4.9.9.2和pthreads-win32 v2.8.0.0 (链接libpthreadGC2.a )。 该库似乎没问题(例如,从main调用pthread_self或pthread_create可以了)。 有什么理由说我不应该从main调用pthread_exit吗?

C Typedef和Struct问题

这两个声明之间的区别是什么,并且优先于另一个? typedef struct IOPORT { GPIO_TypeDef* port; u16 pin; } IOPORT; typedef struct { GPIO_TypeDef* port; u16 pin; } IOPORT;

为什么scanf()需要&运营商(地址)在某些情况下,而不是其他情况?

为什么我们需要在scanf()放置一个&运算符来存储整数数组中的值,而不是将字符串存储在char数组中? int a[5]; for(i=0;i<5;i++) scanf("%d",&a[i]); 但 char s[5]; scanf(“%s”,s); 我们需要传入存储值的地址,因为数组是指向第一个元素的指针。 因此在int / float数组的情况下,它基本上意味着(a+i) 。 但是字符串的情况怎么样?