- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
有没有办法在 fd_set 中打印套接字的状态?
假设我有这段代码:
int main(int argc, char * argv[]) {
int sockfd, newfd, i;
struct sockaddr_un sv_addr, cli_addr;
int sv_len, cli_len;
fd_set testmask, mask;
if ((sockfd = socket(AF_UNIX,SOCK_STREAM,0))<0) {
perror("Error creating socket");
exit(-1);
}
bzero((char*)&sv_addr,sizeof(sv_addr));
sv_addr.sun_family = AF_UNIX;
strcpy(sv_addr.sun_path,UNIXSTR_PATH);
sv_len=sizeof(sv_addr.sun_family)+strlen(sv_addr.sun_path);
unlink(UNIXSTR_PATH);
if(bind(sockfd,(struct sockaddr*)&sv_addr,sv_len)<0) {
perror("Error binding socket");
exit(-1);
}
listen(sockfd, 15);
FD_ZERO(&testmask);
FD_SET(sockfd,&testmask);
for(;;) {
mask = testmask;
select(MAXSOCKS,&mask,0,0,0);
if(FD_ISSET(sockfd,&mask)) {
cli_len = sizeof(cli_addr);
newfd = accept(sockfd, (struct sockaddr*)&cli_addr, &cli_len);
echo(newfd);
close(newfd);
}
for(i=0;i<MAXSOCKS;i++) {
if (FD_ISSET(i, &mask)) {
close(i);
FD_CLR(i, &mask);
}
}
}
close(sockfd);
return 0;
}
我的程序中的一切都在工作(它是一个回显服务器,客户端发送一条线,服务器只是回显它)。我想在选择调用之后,在服务器终端打印类似的东西;00011011011这意味着,打印准备好处理的 socks 。无论如何我可以做到这一点吗?
还有,在for循环的最后我应该做什么?我知道我必须以某种方式清除 fd_set。我这样做的方式(小for循环关闭和FD_CLR fd_set)是否正确?或者我应该换一种方式吗?
PS:对不起我的英语或任何错误。 :)
最佳答案
[这没有回答你的问题,但是refers to a comment to the OP对于另一个评论来说太长了]
来自 man select
:
nfds is the highest-numbered file descriptor in any of the three sets, plus 1.
nfds
不是一个常量!手册页不阅读:
[...] the highest-possible-numbered file descriptor [...]
nfds
必须动态描述传递给 select()
的 fd_set
。
int nfds = sockfd + 1;
for(;;) {
mask = testmask;
select(nfds, &mask, 0, 0, 0);
if(FD_ISSET(sockfd,&mask)) {
cli_len = sizeof(cli_addr);
newfd = accept(sockfd, (struct sockaddr*)&cli_addr, &cli_len);
echo(newfd);
close(newfd);
}
for(i = 0; i < nfds; ++i) {
if (FD_ISSET(i, &mask)) {
close(i);
FD_CLR(i, &mask);
}
}
}
为每个添加到 fd_set
并传递给 select()
的套接字描述符调整 nfds
。
关于c - 打印 FD_SET 中 fds 的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20955071/
我正在使用以下设置运行 valgrind: valgrind --tool=memcheck --tool=callgrind --num-callers=20 --track-fds=yes --e
我的 C++ 程序在 Linux 下运行,运行很多子进程,并且在每次 fork 运行子进程后,我关闭所有继承的 fds 以防止子进程访问它们。现在,我的程序也从其父级继承了一些 fds,在程序启动时关
我有一个类似于这里描述的问题: Prevent fork() from copying sockets 基本上,在我的 Lua 脚本中,我生成了另一个脚本: 不需要以任何方式与我的脚本通信 我的脚本完
您好,我想监控来自 libssh 连接 api 的 FD。但也想监控 STDIN,并解析来自 STDIN 的命令。 我可以在 C++ 中使用 poll 来做到这一点吗? 最佳答案 不在标准 C++
我需要将文件描述符附加到 GLIB 主循环。我的问题是文件描述符列表在执行期间未固定。 根据 GLIB 文档,我可以: 使用 g_io_channel_unix_new 为每个 FD 创建一个 GIO
我一直在阅读 libev's source code并偶然发现了这条评论: a) epoll silently removes fds from the fd set. as nothing tell
我知道 fork 和 exec 系列在执行后保留文件描述符。这种行为符合我的需要。同样来自 exec 手册: The exec() family of functions replaces the c
当服务器收到终止信号时,它会退出 select() 监视集合 (fd_set) 中的 fd 的循环。 是否有必要查看 fds 并调用 shutdown(fd, SHUT_RDWR) 如果集合中还有它们
有没有办法在 fd_set 中打印套接字的状态? 假设我有这段代码: int main(int argc, char * argv[]) { int sockfd, newfd, i;
procfs 会告诉我某个进程在任何给定时间正在使用哪个 fds。但是有没有办法确定哪些是开放阅读还是哪些是写作? 在下面的输出中,显然进程所有者(用户“x”)对链接/文件具有读/写访问权限,但这与知
我想从 stdin 处理 SSL,并从 stdout 发送 SSL,但 OpenSSL 在 set fd 调用中只接受一个文件描述符: SSL_set_fd(ssl, sock); 有没有办法将 st
我有一个独特的问题,我的代码中使用的 linux 轮询系统调用获取它等待轮询的 fds,我的意思是每毫秒轮询一次。这会导致 CPU 使用率过高。我提供了 100 毫秒的超时,但似乎没有用。任何人都可以
我正在设计一个程序(C++11,目标 Linux,CentOS 7,如果重要的话),其中一个线程将调用 ppoll 以阻塞多个 fds,而对这些 fds 的任何读/写都将在其他线程上进行.所有这些 f
选择高于 255 的 fds 不检查 fd 是否打开。这是我的示例代码: #include #include #include #include int main() { fd_set
我有两个文件描述符,fd1 和 fd2 我想从中读取和写入。我将它们放在 fd_set 中: fd_set socks; FD_ZERO(&socks); FD_SET(fd1,&socks); F
TL;DR 如何在不继承所有属性(文件描述符、内存映射、工作目录、花哨的新内核功能、... ) 来自 parent ? 在 Linux 系统上创建新进程的两种传统方式是 fork和 clone . l
我是一名优秀的程序员,十分优秀!