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

问题描述 投票:0回答:2

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

谢谢你。

c unix select client recv
2个回答
3
投票

rfds
wfds
参数使用不同的集合,这样您就可以区分
select
何时位于一组而不是另一组中。

sockfd



0
投票

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

当我从手机发送数据时,数据会存储在接收缓冲区中,但不会打印在控制台上。一旦我按下 Enter 键,它就会打印缓冲区数据。

您能帮忙缺少什么吗?

© www.soinside.com 2019 - 2024. All rights reserved.