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() 的情况下做到这一点?目前我有一个阻塞的接收和发送,但服务器可能需要接收多个命令,同时正在处理另一个命令以发送回客户端。我对c和'select()'非常了解。因为 select 具有三个 fd_set 选项(读取、写入、执行),所以我想也许我可以做到这一点。

谢谢你。

4

1 回答 1

3

rfds对和wfds参数使用不同的集合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();
于 2012-09-19T03:34:22.177 回答