我想使用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选项(read、write、execute),我想我可以这么做。
谢谢您。

最佳答案

rfdswfds参数使用不同的设置,以便可以区分select在一个设置中而不是在另一个设置中。

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();

10-07 22:30