首页 文章

Select()使用相同的套接字描述符发送和接收

提问于
浏览
1

我想使用select在同一套接字描述符(服务器端)上接收和发送客户端/服务器 .

timestruct* myTime;
sockfd = accept(listeningFd, 0, 0);

while(1)
    FD_ZERO(&my_fd_set)
    maxFd = sockfd
    FD_ZERO(&my_fd_set);
    FD_SET(sockfd, &my_fd_set);
    select(maxFd+1, &my_fd_set, &my_fd_set, NULL, myTime);

    for (j=0; j<=maxFd; j++)

    if(FD_ISSET(j, &temp_fd_set))
        if(j==sockfd)
            send()
        if(j==sockfd)
            recv()

这基本上就是我想要做的 . 显然这不起作用,因为sockfd将是相同的发送和接收值 . 有没有办法我可以不使用fork()?目前我有一个阻塞recv和send但是服务器可能需要recv多个命令,而另一个命令正在处理以发送回客户端 . 我非常了解c和'select()' . 因为select有三个fd_set选项(读,写,执行),我想也许我可以做到这一点 .

谢谢 .

1 回答

  • 3

    使用 rfdswfds 参数的不同集合为 select ,因此您可以区分 sockfd 在一个集合中而不在另一个集合中 .

    fd_set rfds;
    fd_set wfds;
    FD_ZERO(&rfds);
    FD_ZERO(&wfds);
    
    FD_SET(sockfd, &rfds);
    FD_SET(sockfd, &wfds);
    if(select(sockfd + 1, &rfds, &wfds, NULL, myTime) < 0) {
        perror("select");
        return -1;
    }
    
    if(FD_ISSET(sockfd, &rfds))
        recv();
    if(FD_ISSET(sockfd, &wfds))
        send();
    

相关问题