지금 안드로이드와 PC간의 사진 파일 전송을 하는데

안드로이드->PC로는 사진파일이 정상적으로 전송됩니다.



문제는 PC->안드로이드인데...


이게 골때린게

PC와 안드로이드를 USB 테더링으로 연결하면 순식간에 별 문제 없이 전송됩니다.


전송속도로 볼때

아마 테더링 연결하면 서로간에 데이터 주고받을때 네트워크를 통하는게 아니라

그냥 케이블을 통해 주고받는거같더군요

메가바이트 단위가 되어도 1초내로 주고받는걸 보면...


근데 이걸 USB 케이블 뽑고 3G망이나 와이파이를 통해 통해 송수신 하게 하면 사진이 깨집니다.

무선네트워크라 데이터가 손실되는건가...싶어서 용량체크를 해보면 오히려 받은 용량이 더 크더군요


final.jpg




final.jpg

전송 방법에 따라서 주고받는 데이터가 다르다는게..

그것도 한방향 데이터 전송만 이렇게 깨진다는게 솔찍히 뭔가 이상한데...

도움을 주실 수 있으신분 계신가요






///////////////////////////////안드로이드


            for(int sleepint=0; sleepint<10; sleepint++)

            {

         try {

                Thread.sleep(3000);

               } catch (InterruptedException e) {

                e.printStackTrace();

               }


     try

     { 

     InetAddress serverAddr = InetAddress.getByName(serverIP);

     Log.d("TCP", "C: Connecting...");

     Socket socket = new Socket(serverAddr, serverPort);

     try

     {

     BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream()); 

     wrpath=tempstr+"/final.jpg";

     FileOutputStream output = new FileOutputStream(wrpath);

     System.out.println("wrpath___"+wrpath);

     int size = 0;

     byte b[] = new byte[1024];

    

     while(socket.getInputStream().read(b)>0)

     {

     output.write(b);

     output.flush();

     }

              

         output.close();

     socket.close();

     break;

     }

     catch(Exception e){

     System.out.println("연결 실패1");

     e.printStackTrace();

     }

    

     finally {socket.close();}

     }

     catch (Exception e) {

     System.out.println("연결 실패2");

     Log.e("TCP", "C: Error2", e);

     }

    

        

            }

    

////////////////////////////Cpp


struct sockaddr_in server_addr, client_addr; // socket address

SOCKET server_fd, client_fd; // socket handle

char buf[BUF_LEN+1]="";

int len, msg_size;

FILE *fp;

char buff[1024];

char buff2[1024];

// Load WinSock DLL

WSADATA wsa;

if(WSAStartup(MAKEWORD(2,2), &wsa) != 0)

return -1;


// socket 생성

server_fd = socket( PF_INET, SOCK_STREAM, 0 );

memset( &server_addr, 0, sizeof(struct sockaddr) );

server_addr.sin_family = AF_INET;

server_addr.sin_addr.s_addr = htonl(INADDR_ANY);

server_addr.sin_port = htons(8000);

// bind() 호출

if( bind(server_fd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) < 0 ){

printf("바인딩 실패.\n");

exit(0);


}


////system("cls");

listen(server_fd, 5);

printf("__Send접속 및 파일 수신 대기중.\n");

len = sizeof(client_addr);

// 연결요청을 기다림

client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &len);

if(client_fd < 0) {

printf("연결 수락 실패.\n");

exit(0);

}

printf("__Send클라이언트 접속 됨.\n");



fp = fopen("d:\\t\\t4\\final.jpg", "rb");

//fp = fopen("d:\\t\\file1.jpg","wb");

int readlen=0;

while(1)

{

readlen=fread(buff, 1, 1024, fp);

if(readlen<1024)

{

send(client_fd, buff, 1024, 0);

break;

}

send(client_fd, buff, 1024, 0);

printf("send_%d ",readlen);

}

printf("전송 종료 ");

closesocket(client_fd);

closesocket(server_fd);

return 0;

/////////////////////////////////




일단 안드로이드->PC로의 각 주고받는 부분은 저렇습니다.


그냥 주고받는게 아니라 PC에서 처리를 해서 돌려주는거라서

PC에서 보내줄 수 있을때까지 안드로이드가 3초간격으로 10번, 총 30초간 연결을 시도하고


연결이 성공하면 PC에서 파일을 보내고

안드로이드에서 받습니다.