어떻게 해야하나요 ㅠ 도와주세요 ㅠ
글쓴이: wnldirqhrdyd / 작성시간: 화, 2010/03/23 - 2:27오후
안녕하세요
서버에서 클라이언트에게
브로드캐스팅 하는데요
sleep을 안주면 데이터가 비정상적으로 전송이되고
sleep을 주면 데이터가 정상적으로 전송이 됩니다.
브로드캐스팅 구조에서 이런식으로 슬립이 들어간다면
클라이언트의 수가 늘어날수록 느려질거라 생각이 들어서
좋은 방법 없나요? ㅠㅠ
아! 보내는 데이터는
예를 들어서 800 바이트라면 100바이트씩 끊어서 보냅니다
800바이트면 8번, 879바이트면 9번.. 이런식으루요..
끊어서 보내는 데이터가 슬립을 안주면 연결이 안되고
슬립을 주면 제대로 전송 되는 현상입니다 ㅠ
for(wi=0; wi < nBufCnt; wi++) { memset(writeBuf, 0x00, WRITE_BUF_SIZE); memcpy(writeBuf, testBuf+(WRITE_BUF_SIZE*wi), WRITE_BUF_SIZE ); RuntimeLog(" >%2d's [%s]", wi, writeBuf); // WRITE... write(sockfd, writeBuf, sizeof(writeBuf)); usleep(100000); }
Forums:
write로 전송후 전송이
write로 전송후 전송이 완료되었는지 select문으로 체크한후 하시면 되지 않을까요?
버퍼의 내용이 모두 전송이 되지 않은 상태에서 다시 버퍼를 덮어 씌울 수 있을것 같습니다.
정말 죄송한데요 ㅠ
제가 초보라서 잘 이해가 안가서요..
write 후에 다시 select 문을 호출해서 변경이 일어났을 경우만 write를 다시 하라는 말씀이신가요?
select 함수의 3번째
select 함수의 3번째 인자에 write_fdset 을 지정할 수 있습니다.
여기에 해당 소켓을 FD_SET 하신후 select 함수를 수행하시면 해당 소켓이
데이터를 송신할 수 있는 상태인지 파악할 수 있습니다.
select 함수후 FD_ISSET 결과에 따라서 송신가능상태를 판단하시면 될것 같습니다.
저도 오래전에 한걸 기억해서 알려드리니 자세한건 select 함수의 write set 인자를
찾아보시면 해결하실 수 있을겁니다.
그건 그렇고
write 문의 결과값을 검사해서 다 못 보냈으면 덜 보낸 부분을 다시 write하는 부분이 있어야 하는데 빠졌네요.
소켓 통신에 관한 아무 책이나 찾아보시면 나올 듯.
* 그리고 첫 줄의 memset은 도대체 왜 하는 거죠?
댓글 달기