Articles of c + +

如何在Linux中重新绑定udp套接字

我是一个有经验的Linux套接字编程人员,正在编写一个有很多出接口的服务器应用程序。 现在,服务器套接字与INADDR_ANY一起绑定到进程开始时的随机源端口。 稍后在提交对特定节点的响应时,我需要分配一个固定的源IP地址 。 标准的做法是调用bind。 但是,绑定被调用一次端口号, 连续调用失败,无效的参数错误。 创build一个新的套接字并不是一个好的select,因为在响应某些客户端时,我将不得不经常这样做。 我也探讨了SO和许多套接字选项,如IP_FREEBIND,但它并不完全符合我的scheme。 也许使用IP_PKT_INFO和设置源地址可能会工作,除非它遭受同样的问题,即不允许套接字一旦绑定到INADDRANY重新绑定到一个固定的源IP后者。 有没有办法解除绑定现有的套接字或替代方式来设置传出数据包中的源IP地址? int sock = socket(AF_INET, SOCK_DGRAM, 0); if(sock < 0) printf("Failed creating socket\n"); struct sockaddr_in addr; memset(&addr, 0, sizeof(struct sockaddr_in)); addr.sin_family = AF_INET; addr.sin_port = htons(1500); addr.sin_addr.s_addr = INADDR_ANY; // first bind succeeds if ( (status = bind(sock, (struct sockaddr *) &addr, sizeof(addr))) < 0) […]

等待多个信号而不需要等待(C / C ++ Linux)

如果我有多个信号量,那么我怎么能有一个进程块,直到至less有一个信号量是免费的? 我知道我可以用忙等待循环来做到这一点,例如: // blocks until one of the semaphores in sems is free, returns // index of semaphore that was available int multiple_sem_wait(sem_t **sems, int num_sems) { while (true) { for (int i = 0; i < num_sems; ++i) { if (sem_trywait(sems[i]) == 0) { return i; } } } } 但是有没有办法做到这一点,没有繁忙的循环? 也许除了应该使用的信号量外,还有一些IPC技术? 谢谢

编译我自己的内核(而不是从linux-kernel源代码)

我从这里跟随内核教程 即时通讯编辑我的文件有问题。 当我尝试编译时出现以下错误: main.c:8: error: expected declaration specifiers or '…' before 'size_t' main.c:8: error: conflicting types for 'memcpy' ./include/system.h:5: note: previous declaration of 'memcpy' was here main.c: In function 'memcpy': main.c:12: error: 'count' undeclared (first use in this function) main.c:12: error: (Each undeclared identifier is reported only once main.c:12: error: for each function it appears […]

在Linux和OS X上的ns精度单调时钟

clock_gettime(CLOCK_MONOTONIC, …)可以在Linux中使用,但不能在OS X上使用clock_gettime(CLOCK_MONOTONIC, …)计时器在OS X中可用,但在Linux中不可用。 我怎样才能得到一个ns的精度单调时钟在C和Linux和OS X的作品?

getnameinfo指定socklen_t

getnameinfo原型的第二个参数要求socklen_ttypes,但sizeof使用size_t。 那么我怎样才能得到socklen_t? 原型: int getnameinfo(const struct sockaddr *restrict sa, socklen_t salen, char *restrict node, socklen_t nodelen, char *restrict service, socklen_t servicelen, int flags); 例: struct sockaddr_in SIN; memset(&SIN, 0, sizeof(SIN)); // This should also be socklen_t ? SIN.sin_family = AF_INET; SIN.sin_addr.s_addr = inet_addr(IP); SIN.sin_port = 0; getnameinfo((struct sockaddr *)&SIN, sizeof(SIN) /* socklen_t */, BUFFER, NI_MAXHOST, […]

调用posix_spawn时closures所有文件句柄

我想使用posix_spawn(…)(或者非常相似的东西)产生一系列进程。 这个函数接受一个posix_spawn_file_actions_ttypes的参数,它允许我指定如何处理打开的文件句柄。 从文档中我可以确定,所有文件都从调用进程inheritance,并根据posix_spawn_file_actions_t结构中的信息进行修改。 我希望所有文件都未被生成的进程打开(stdin,stdout和stderr除外)。 有谁知道如何做到这一点? 显然这可以在一些实现中使用'POSIX_SPAWN_CLOEXEC_DEFAULT'spawn属性标志来完成,但是这在我的平台上是不可用的。 我也可以使用fcntl(…)在打开文件的时候指定'close on exec',但是我觉得这个问题的一个更加本地化的解决scheme是可取的。

在C中使用stdin和select()

我有以下程序: #include <stdio.h> #define STDIN 0 int main() { fd_set fds; int maxfd; // sd is a UDP socket maxfd = (sd > STDIN)?sd:STDIN; while(1){ FD_ZERO(&fds); FD_SET(sd, &fds); FD_SET(STDIN, &fds); select(maxfd+1, &fds, NULL, NULL, NULL); if (FD_ISSET(STDIN, &fds)){ printf("\nUser input – stdin"); } if (FD_ISSET(sd, &fds)){ // socket code } } } 我面对的问题是,一旦在STDIN上检测到input,“用户input – 标准input”信息将继续打印…为什么在循环检查哪些描述符已input时不打印一次? […]

虽然没有任何投入,为什么投票仍在返回?

我写了一个小testing程序来弄清楚如何与poll进行交谈。 我创build了三个文件testa , testb , testc ,并将stringhello\n写入第一个。 所以,这里是我的poll : poll(polls.data(),polls.size(),-1) 根据手册页,超时-1应表明系统调用永远不会超时。 然而,它没有任何东西可以读。 我总是消耗一个字节的input,可以看到你打印的hello\n ,但民意调查并没有停止在那里。 它只是假装在那里有东西要读。 #include <sys/types.h> #include <sys/stat.h> #include <sys/fcntl.h> #include <sys/poll.h> #include <unistd.h> #include <errno.h> #include <vector> #include <map> #include <string> #include <iostream> typedef int fd_t; int main() { fd_t const a = open("testa",O_RDONLY); fd_t const b = open("testb",O_WRONLY); fd_t const c = […]

字符设备捕获多个(int)ioctl参数

我必须编写一个linux char设备,它可以为每个unlock_ioctl处理ioctl(无BKL)函数。 目前,我可以从用户空间ioctl命令收到一个参数 __get_user(myint, (int __user *) arg); 我怎样才能接收多个int参数(例如这个调用)? ioctl(fp, SZ_NEW_DEV_FORMAT, 0, 1, 30);

无法理解Linux内核模块中read_proc的工作

我正在阅读此页面上的内核模块示例 程序中使用的read_proc如下所示: int fortune_read( char *page, char **start, off_t off, int count, int *eof, void *data ) { int len; if (off > 0) { *eof = 1; return 0; } /* Wrap-around */ if (next_fortune >= cookie_index) next_fortune = 0; len = sprintf(page, "%s\n", &cookie_pot[next_fortune]); next_fortune += len; return len; } 有人可以解释为什么off被检查为大于0.此外,有人可以解释什么是closures和计数论证的重要性。 到目前为止,我的理解是,我们必须在页面上写入数据,并且在数据结束时必须设置eof。 谢谢。