2012-09-19 31 views
1

我想使用select在同一套接字描述符(serverside)上的客戶端/服務器上接收和發送數據。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和發送,但可能需要服務器recv多個命令,而另一個命令正在處理髮送回客戶端。 我很清楚c和'select()'。因爲select有三個fd_set選項(讀,寫,執行),所以我想也許我可以做到這一點。

謝謝。

回答

3

使用rfdswfds參數的不同組合來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(); 
+0

哇。謝謝,它現在起作用!現在看起來很明顯!除了這個,我正在嘗試一切。 :/ – RileyVanZeeland