我想使用选择在同一套接字描述符(服务器端)上的客户端/服务器上接收和发送。
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 并发送,但服务器可能需要接收多个命令,同时正在处理另一个命令以发送回客户端。我非常了解c和"select()"。因为 select 有三个fd_set选项(读取、写入、执行),我想也许我可以做到这一点。
谢谢。
对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();