소켓에 select를 걸고 select의 read가 들어올때 read를 2번 하려고 하는데 잘 안되네요~
리눅스 기반이구요~ 서버쪽 입니다.
FD_ZERO(&selt);
FD_SET(unix_sock, &selt);
FD_SET(g_inet_sock, &selt);
select_rtn = select(maxfd+1, &selt, 0, 0, 0);
/* 외부, 내부 socket 데이터 수신에 따른 처리 함수 호출 */
if(select_rtn > 0)
{
if(FD_ISSET(unix_sock,&selt))
{
printf("내부 소켓\n");
}
if(FD_ISSET(g_inet_sock,&selt))
{
printf("외부 소켓\n");
out_rtn = outside_data();
if(out_rtn <= 0)
{
return -1;
}
fflush(g_inet_sock);
}
}
int outside_data()
{
int flag = 0;
int rd_rtn;
int size = 0;
char recv_buff[1024];
if(flag == 0)
{
flag = 1;
rd_rtn = read(g_inet_sock, recv_buff, 2); //길이를 리드 하는 부분
size = size(recv_buff); //사이즈를 구하고 리턴
}
else if(flag == 1)
{
flag = 0;
rd_rtn = read(g_inet_sock, recv_buff, size); //전체 패킷을 리드 하는 부분
process_data(recv_buff); //업무처리 하는 함수 콜
}
}
위에 방식으로 select를 걸었습니다.
inet에서 select가 걸려서 outside_data()함수로 가서 리드를 2번 하고 싶은데 잘 안됩니다.ㅠ.ㅠ
처음에는 패킷의 길이를 알기위해 read를 하고요 2번째는 총길이를 알고 나서 그만큼 리드를 하기 위해 또한번 리드를 하게 됩니다.
그리고 처음에는 클라이언트에서 보내는 값과 동일하게 나옵니다. 하지만 2번째 리드할때 데이터를 못받는 것인지 값이 출력이 안됩니다.
클라이언트에서는 write를 2번 하고 있습니다.
그리고 또 하나는 fflush(g_inet_sock);를 안해주면 printf("외부소켓\n")을 엄청 찍더라고요~
fflush(g_inet_sock); 이 무슨 역할을 하는 것인지? 궁금합니다. 대략으론 버퍼를 비워 주는 걸로 알고 있는데 맞는지요?
이상입니다.^^
flag가 지역변수인데 전역변수같이 쓰셨네요.
flag가 지역변수인데 전역변수같이 쓰셨네요.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
아 그부분은 수정하였습니다.^^
지금 현재 계속 테스트중에 수정하였습니다.
감사합니다. 그래도 안되요.ㅠ.ㅠ
일단 소켓 초기화 코드가 제대로 되었는지 확인 한 번
일단 소켓 초기화 코드가 제대로 되었는지 확인 한 번 더 해보시고요,
read()는 위 코드처럼 if-else if로 분리할 필요 없이
read(sock, &size, sizeof(int));
read(sock, buff, size);
이렇게 연달아서 읽으면 됩니다.
물론 클라이언트에서도
size=패킷크기;
write(sock, &size, sizeof(int));
write(sock, buff, size);
이렇게 그냥 연달아 보내면 되고요.
----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라
댓글 달기