2012-09-17 2 views
2

Select 호출로 클라이언트 서버 코드를 테스트하고 있습니다. 하지만 일단 클라이언트에서 서버로 보내면 클라이언트가 Ist 패킷 이후 아무 것도 보내지 않더라도 서버는 계속 클라이언트가 보낸 버퍼에서 읽습니다. 내가 잘못하고있는 것은 무엇입니까?클라이언트 버퍼에서 선택 및 읽기 연속적으로 서버가 멈춤

fd_set readSet,master_list_read; 
FD_ZERO(&master_list_read); 
FD_SET(STDIN, &master_list_read);//stdin manually trigger reading 
FD_SET(sockfd, &master_list_read);//tcp socket 

struct timeval tv; 
int retval; 
tv.tv_sec = 10; 
tv.tv_usec = 0; 
while(1) 
{ 
bool idle=false; 
char *buffer=NULL; 
int n; 

tv.tv_sec = 10; 
readSet=master_list_read; 
retval = select(sockfd+1, &readSet, NULL, NULL,&tv); 
if (retval == -1) 
{ 
    perror("Error in select\n"); 
    exit(4); 
} 
else if(retval==0) 
{ 
    printf("*********SEND SUCCESSFUL******\n"); 
}  
else 
{ 
if(FD_ISSET(0, &readSet)) 
{ 
    bzero(buf,256); 
    fgets(buf,256,stdin); 
    if (send(sockfd, buffer,n, 0) == -1) perror("error in sending MSG to server\n"); 
} 

else if (FD_ISSET(sockfd, &readSet)) // receives data from server,print it on StdOutput 
{ 
    bzero(buf,256); 
    int nbytes = recv(sockfd, buf, 256,0); 
    if(nbytes<=0) 
    { 
     perror("recv error from server \n"); 
     exit(0); 
    } 
} 

} //END OF ELSE 
} //end of while 
close(sockfd);   
return 0; 
+0

코드를 읽을 수 있도록 포맷하십시오. 또한 소켓을 생성하고 초기화하는 방법도 포함하십시오. –

+0

fd_set이 구조체이기 때문에,'readSet = master_list_read'가 작동한다고 기대할 수 없습니다. [this] (http://linux.die.net/man/2/select_tut)을 읽으면 모든 반복에서 fd_set을 재 초기화 (FD_ZERO)하는 것이 가장 좋습니다. – fvu

+4

첫눈에 fd_set을 한 번만 초기화하는 것으로 나타 났지만 실제로 select()를 호출하기 전에 _every__를 다시 초기화해야합니다. – Jerry

답변

6

당신의 while(1) 루프의 select() 호출이 변경되지 않은 readSet 잎 : 아래

의 코드 조각입니다. 이것은 나중에 FD_ISSET() 검사가 성공 함을 의미합니다.

해결책은 간단하다 : 모든 반복에 FD_SET 년대를 지우 :

FD_ZERO(&master_list_read); 
FD_SET(STDIN, &master_list_read); 
FD_SET(sockfd, &master_list_read); 
// only now the select() returns what you need 
retval = select(sockfd+1, &master_list_read, NULL, NULL,&tv); 

// use the master_list_read later 

는 단순히 FD_SET을 복사하는 것은 문제가 해결되지 않습니다.

관련 문제