繁体   English   中英

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

[英]Select() send and receive with same socket descriptor

我想使用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选项(读,写,执行),我想也许我可以做到这一点。

谢谢。

使用不同的集合来select rfdswfds参数,这样就可以区分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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM