소켓 파일 전송에서... 질문있는데여~!!
글쓴이: 익명 사용자 / 작성시간: 토, 2002/01/12 - 2:49오전
소켓으로 파일 전송하는 프로그램을 짤려고 하는데여...
서버에서.. 파일을 루프를 사용해서.. send 로 보내고..
클라이언트에서는.. (제가 MFC 로 짰는데..)WSAAsyncSelect를 사용해서
비동기 모드로해.,. FD_READ 메시지가 발생하면 받게 했거든요..
그런데.. FD_READ 메시지가 서버에서 보내는 속도를 못따라가는거 같아
여.. 그래서 파일이 앞에 몇게랑...뒤에 몇게밖에 전송이 안돼는거 같은데
여.. 어떻게 전송하면 돼죠??
다른... 명령이라도 있나여??
아니면.. 보내는거를 느리게 보내야 하나여?? 그럼 속도가 넘 느려지는
데..
좀 알려주세여~~!! 글구.. 패킷을~~ 헤더로 음~ 뭐 해서 나눈다는건 무슨
말인지 아시는지??
Forums:
Re: 소켓 파일 전송에서... 질문있는데여~!!
안녕하세요...
파일 전송은 서버에서는 동기적으로 보내어 주는데 클라이언트에서 비동기
로 받는다면... 받는건 문제가 없지만은 나중에 파일을 합칠 때 문제가 있
지 않을까 쉽네요...
그리고 중간에 데이터가 사라지는건 크드를 봐야 알겠지만 버그가 아닌가
생각이 드네요...
중간에 데이터가 유실 되는건 일반적인 tcp/ip 에선 이해 하기가 힘든것
같네요...
제가 권해드리고자 하는 방법은 read(), write()함수(in VC++)를 사용해
서 동기적으로 구현을 해보시는게 어떨까 쉽네요...
그리고 패킷을 헤드로 나눈다는것은 UDP나 이런 비동기적 방식을 취할 경
우 전체를 만들 때 각 패킷의 역할을 알아야 하기 때문에 이렇게 구현을
하는 것입니다.
예를 들어...
struct header {
패킷넘버;
패킷역활;
패킷바디; /* 실제로 사용자가 보내고자 하는 자료(정보) */
};
위와 같은 식으로 구성하는 걸 얘기합니다.
그리고 위에서 패킷바디 부분은 따로 떼어내서 구성하기도 합니다.
참고 하시길...
_ 信
Re^2: 소켓 파일 전송에서... 다시 질문이여~~
서버에서 동기적으로 보낸다는게 무슨말이죠??
비동기는 알겠는데... 글구.. blocking 하고.. not-blocking 도 있던데..
^^; 제가 읽어본책에는... 동기적이 무엇인지 안나와있네여...음..혹시
blocking 이 동기적인가?? 글구. 서버에서 동기적으로 파일을 while 문으
로 보내면.. 클라이언트에서도 while 문으로 파일이 왔을때부터 받아야 하
나여?? 글구 비동기에서 동기로 바꿀려면 어떻게 해야 하나여?? 헤헤~
알려주세여~~ 아 그리고 소켓은.. STREAM 으로 연결했는데여...read()와
write() 문이.. send()와recv() 와 다른점이 있나여??그러니깐 더 좋은점
이라던지.. 저는 파일을 CFile 객체를 생성해서.. 버퍼로 읽고..그걸
while 문으로 돌려서 send 로 보냈는데... 무슨 잘못된 점이라도..
Re^3: 소켓 파일 전송에서... 다시 질문이여~~
동기적이라 하면은 말그대로 순서적으로...
앞의 데이터를 받으면 다음 데이터를 받고 하는식으로 하는 것을 말합니
다.
UDP는 이와 상관없이 그냥 데이터를 보내기만 합니다.
이런 경우 데이터가 유실 되었는지 여부도 알수가 없고...
순서도 알수가 없습니다.
그러나 이것도 해결 방법이 없잖아 있기는 하지만은...
데이터를 재구성을 하고...
데이터 유실 여부도 확인을 해야 하기 때문에 구현이 아주 까다롭습니다
(이에 관한 예는 RTP가 좋은 예가 될듯 하네요).
그러나 tcp/ip로 보내게 되면은 이런 과정은 신경을 쓸 필요가 없습니다.
그로인해 약간의 속도에서 떨어지기는 하지만은...-_-a
그리고 send()함수를 사용을 해도 상관은 없습니다.
그러나 전 보통 send(), rcv() 보단 write(), read()를 즐겨 사용을 하기
에 권해드리는 것입니다.
send()와 recv()에 플레스 인수가 하나 더 있는거만 빼면은 별 차이가 없
는거 같네요...
그리고 파일을 전송 할때도 while()문을 이용하지만...
수신 할 경우에도 while()을 돌려 파일의 끝이 확인이 될때까지 받아오는
방법을 사용하는게 일반적인 방법입니다.
이라던지.. 저는 파일을 CFile 객체를 생성해서.. 버퍼로 읽고..그걸
while 문으로 돌려서 send 로 보냈는데... 무슨 잘못된 점이라도..YTS
위 부분에 문제가 있다면...
소스를 보고 확인을 해봐야 알 수가 있을 듯 하네요...
- 信
Re^4: 소켓 파일 전송에서... 헤헤 답변 감사합니다.~~
답변해주셔서 감사합니다.
제가 파일을 send 로 보내는도중에 잘못된점이 있더라고여..
그게... send보낼때 제가 비동기모드를 사용해서.. send 가 다 보내지도
않고 리턴을 하더라고여..(알고봤더니...ㅡ.ㅡ;) 그래서 send 로 보낼때
는 비동기 모드를 해제하고. 다시 블로킹 모드로 돌린후에 보냈습니다.
그랬더니 잘가더군여.. 받는쪽에서는 비동기 메시지 전달로 받구여..
프로그램은 잘돌아가여.. 친구랑 테스트도 해봤구...암튼 답변해주셔서 감
사했습니다. 도움이 많이 되었어여..
댓글 달기