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;
코드를 읽을 수 있도록 포맷하십시오. 또한 소켓을 생성하고 초기화하는 방법도 포함하십시오. –
fd_set이 구조체이기 때문에,'readSet = master_list_read'가 작동한다고 기대할 수 없습니다. [this] (http://linux.die.net/man/2/select_tut)을 읽으면 모든 반복에서 fd_set을 재 초기화 (FD_ZERO)하는 것이 가장 좋습니다. – fvu
첫눈에 fd_set을 한 번만 초기화하는 것으로 나타 났지만 실제로 select()를 호출하기 전에 _every__를 다시 초기화해야합니다. – Jerry