용량이 큰 파일을 전송하는 소켓 작성
글쓴이: cjy1126 / 작성시간: 화, 2004/11/09 - 1:13오후
선배의 소개로 3개월간 아르바이트를 하고있습니다.
영상처리, 시리얼통신, db 등 할것이 많지만, 지금 하는것은 tcp를 이용하여 영상처리 데이터를 전송하는 네트웍 프로그램을 만드는 것입니다.
윈도우의 WSAAyncSelect를 이용하여 프로그램을 작성하였는데, 여기서 질문하는것은 그것을 제외하면 bsd 소켓을 사용해서 만들었으니 차이가 없을거란 생각에서입니다.(물론 데브피아에도 소스 올리고 질문했으나 답변이 ㅡ.ㅜ)
클라이언트에서 연결을 누르면 서버에서 데이터를 보내는데, 그 사이즈가 (640*480*3)입니다. 이 데이터를 0.2초마다 보냅니다.
현재의 문제점은 프로그램이 됐다 안됐다 하는것입니다.
서버에서는 데이터를 640*480*3만큼 한번보내고, 그 다음부터는 WSAEWOULDBLOCK 에러가 발생합니다.
클라이언트는 한번의 FD_READ 이벤트도 발생하지 않습니다.
netstat -na를 쳐보면, 둘다 연결상태입니다.
서버는 데이터를 보내는데, 클라이언트가 read를 안해서 서버의 송신버퍼가 풀나는것 같습니다.(어떻게 처리를해야할지, 확인해야할지 모르겠습니다.)
send 함수를 사용할때, 데이터 전송사이즈를 640*480*3만큼 보냅니다.
일단 프로그램의 전송이 한번 제대로되면, 하루종일 켜놔도 잘됩니다.
cpu점유율이나, 메모리 등의 리소스가 하루후에도 모두 일정합니다.
고수님들의 도움을 부탁드립니다.
Forums:
보통의 경우에는 Nagle 알고리즘, delayed ACK, 버퍼 사이즈
보통의 경우에는 Nagle 알고리즘, delayed ACK, 버퍼 사이즈가
짬뽕되어서 전송지연이 나타나는 것이 일반적인 증상인데,
이벤트가 한번도 발생안된다는 것은 무언가 좀 이상합니다.
스니퍼나 이서리얼 걸어서 패킷 오가는 것을 분석해 보세요.
어디까지 진행되다가 멈추는지 파악한 다음에 차분하게 분석해 보는것이 좋을 듯 한데요.
Re: 용량이 큰 파일을 전송하는 소켓 작성
WSAEWOULDBLOCK 에러가 발생하면 그냥 다시 보내시면 됩니다.
에러지만 에러가 아니라고 봐도 무방할듯..
MSDN에서 인용해보면
This error is returned from operations on non-blocking sockets that cannot be completed immediately, for example recv when no data is queued to be read from the socket. It is a non-fatal error, and the operation should be retried later. It is normal for WSAEWOULDBLOCK to be reported as the result from calling connect on a non-blocking SOCK_STREAM socket, since some time must elapse for the connection to be established.
위 내용 중간에 잘 보시면..It is a non-fatal error, and the operation should be retried later
라고 되어있지요 8)제 생각으로는...
서버에서 클라이언트에게 900k정도의 데이터를 보냈는데, 클라이언트에서 recv를 안해서(FD_READ가 발생하지않으니까요 ㅡ.ㅜ) 서버의 송신버퍼의 데이터를 못버리는것 같습니다.
결국 서버의 송신버퍼는 풀상태가되고, 타이머에의해 0.2초마다 send를하니 0.2초마다 send는 -1의값인 에러를 보내네요.(WSAGetLastError()을해보면 WSAEWOULDBLOCK가 나오고요.)
즉, 클라이언트가 첫번째 패킷을 받냐 못받냐가 관건인데, tcp에서 이런 일이 생긴다는게 ㅡㅡ;;;
첫번째 패킷을 잘받으면 그 다음부터는 순조롭거든요.(하루종일 켜놔도 걱정이 없죠.)
밑에분 말씀대로 다시보내면 되지만, 클라이언트에서 FD_READ가 발생하지 않으니, 결국은 계속 WSAEWOULDBLOCK만 걸리네요.
차라리 아예 안되면 속편할텐데... 됐다 안됐다하니 답답하네요.
지금 소스 수정중이라서 주석달고하면 소스도 올려서 질문할려고요.
5개의 클래스로 만들어서, 소스만 올리고 그냥 묻기에는 죄송하네요. ㅡㅡ;;;
답변해주셔서 감사드립니다.
댓글 달기