[완료] 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을 해주니 되는군요.
정말 감사하고요 좋은 하루 되세요..^^
감사합니다
댓글 달기