gpt4 book ai didi

c - 打印 FD_SET 中 fds 的值

转载 作者:太空宇宙 更新时间:2023-11-03 23:28:29 25 4
gpt4 key购买 nike

有没有办法在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com