在FD_SET中打印fds的值

时间:2014-01-06 16:56:11

标签: c sockets select

无论如何在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;
}

一切都在我的程序中运行(它是一个echo服务器,客户端发送一条线路,服务器只是回复它)。 我想在选择呼叫之后,在服务器终端上打印一些类似的东西; 00011011011 这意味着,打印准备好处理的袜子。 无论如何我能做到吗?

另外,在for循环结束时我该怎么办?我知道我必须以某种方式清除fd_set。我这样做的方式(小循环结束和FD_CLR fd_set)是正确的吗?或者我应该以另一种方式做到这一点?

PS:对不起我的英语或任何错误。 :)

2 个答案:

答案 0 :(得分:2)

[这不会回答您的问题,但是refers to a comment to the OP并且对于其他评论而言太长了]

来自man select

  

nfds是三组中任何一组中编号最高的文件描述符,加上1。

nfds 不是常数!手册页读取:

  

[...]最高可能的编号文件描述符[...]

nfds动态地描述传递给fd_set的{​​{1}}。

select()

为要添加到 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); } } } 的{​​{1}}的每个套接字描述符调整nfds

答案 1 :(得分:0)

选择通话后,您检查了sockfd。如果这是真的,则意味着客户端尝试连接您的服务器。然后你接受连接。

newfd = accept(sockfd,(struct sockaddr *)&amp; cli_addr,&amp; cli_len);

newfd是您知道的客户端和服务器之间的fd编号。在这里,您还没有读取clientfd(newfd)数据。接受连接后,您可以读取clentfd上的数据

读取(newfd,缓冲液,的sizeof(缓冲液))

您的数据从客户端发送,现在在缓冲区中。那么也许你可以在clientfd中回显或写()。

您的代码发送到客户端,服务器和客户端之间的fd编号。

此外,如果始终监听客户端,在接受连接之后,您必须将您的客户端fd设置为readfds(代码中的掩码),如FDSET(newfd,&amp; mask)

然后你总是可以听客户端