저번에 네트워크 코딩 관련해서 조언을 구한 뉴비입니다.

조언해주신것을 바탕으로 파이썬과 소켓으로 코드를 짰습니다. 그런데 문제가 생겼는데, 크기가 작은 파일을 전송할경우는 괜찮은데 몇백메가를 넘어서는 파일의 경우 원래 크기보다 작게 수신을 합니다.


송신하는 서버와 수신하는 클라가 1024바이트씩 송수신하면서 파일의 크기만큼 루프를 도는 식으로 파일을 전송하였습니다. sendall()과 recv()함수를 사용했구요.

뭐가 문제인지 확인하기 위해 마지막 송수신에서 바이트내용을 출력하니 루프는 같은 횟수 돌았지만, 전혀 다른 내용이더라구요. 수신이나 송신할때 일부 유실되는 데이터가 있는지 싶어서 두가지 방법으로 해봤습니다.


1. [기존방식] 파일크기를 읽어와서 파일 크기만큼 루프돌며 전송과 수신 => 전부 보냈는지는 모르겠지만 확실히 덜 받아왔음. 원본보다 파일 크기가 작음.

2. 1024바이트씩 수신하면서 1024보다 작게 받아지는경우마다 멈춰서 얼마나 받아왔나 확인함 => 작은경우도 많고 얼마나 작게 받는지도 불규칙적이라 마지막 파일 데이터인지 확인이 불가함. => 파일의 바이너리가 공백일경우 공백으로 받아서 수신이 불규칙적 혹은 소켓에서 데이터 유실을 예상.


두가지 방법 모두 했지만 결국 실패했네요. 구글링해보니 send()는 저수준 네트워크 함수라 데이터가 유실되는 경유가 있으니 고수준 함수인 sendall()을 사용하라해서 seneall을 사용하였지만, 그대로네요...

혹시 이에대해 아시는 분 있나요..?


그리고 혹시 여유있으시거나 코드를 확인해봐야겠다하시는 분있으시면 아래 링크에 있어요..


너무 긴 질문이라 죄송합니다.. :<

- dc official App