[완료] send() 시 select() 사용법
글쓴이: binalee / 작성시간: 화, 2007/04/17 - 2:16오후
안녕하세요. Non Block I/O에서 select()를 이용 send buffer가 쓰기 가능할 경우 send()하려고 합니다.
아래와 같은 방법을 썼는데 send buffer가 꽉 차기 전에는 잘 되는것 같은데 꽉 찬 다음부터는 분명 비워지는것 같은데 select에서 이벤트가 발생 안하네요.
혹시 문제가 있는지 좀 알려주시면 감사하겠습니다.
fd_set writes;
struct timeval timeout;
int fd_max, result;
sock_fd = socket(...);
connect(.....);
FD_ZERO(&writes);
FD_SET(sock, &writes);
fd_max = sock;
while(1)
{
timeout.tv_sec = 2;
timeout.tv_usec = 0;
result = select(fd_max+1, NULL, &writes, NULL, &timeout);
if(result == 0)
{
printf("wait\n");
}
else if(result == -1)
{
printf("select error : %d\n", errno);
}
else
{
printf("upper FD_ISSET\n");
if(FD_ISSET(sock, &writes))
{
MESSAGE_SEND();
}
}
} 여기서 MESSAGE_SEND()를 계속 잘 하다가 상대방의 receive 속도가 느려서 send buffer가 꽉 차게 되면
계속 wait만 찍힙니다. (분명히 send buffer는 조금씩 비워지는데 말이죠.. ㅠ.ㅠ)
그럼 답변 부탁드립니다.
Forums:


select()의 인자로
select()의 인자로 전달된 fd_set이 변화하게 되므로 별도의 fd_set 변수를 이용해야 합니다.
fd_set wfds = writes;
select(fd_max+1, NULL, &wfds, NULL, &timeout)
이렇게 사용해보세요
while(1) { FD_SET(sock,
while(1)
{
FD_SET(sock, &writes);
select()
.
.
.
}
감사합니다. 해결됐습니다.
감사합니다. 윗에 두분 말씀대로 복사본 만들고 while아래에서 다시 FD_SET을 해주니 되는군요.
정말 감사하고요 좋은 하루 되세요..^^
감사합니다
댓글 달기