레이블이 System & Net인 게시물을 표시합니다. 모든 게시물 표시
레이블이 System & Net인 게시물을 표시합니다. 모든 게시물 표시

2008년 11월 23일 일요일

[Linux] Thread Server 포트 2개 열기

more..



출처 : http://kldp.org/node/94310 

TCP Server [Thread]

more..

2008년 11월 18일 화요일

JAVA 와 C 간의 TCP 통신시 Endian 처리


두 다른 언어를 TCP 로 연결할때 플랫폼이 다르다면 시스템이 little-Endian / Big-Endian 인지 확인하여야한다.
일반적으로 Linux 은 little-Endian Windows 는 Big-Endian 을 사용한다. ( 시스템 마다 차이 있을수 있음 )

Server ( Linux C )
Client (windows JAVA) 일경우에는 ..

C 에서 받은 버퍼를 받아 Endian 처리를 다음과 같이 변환하여야한다. (int 자료형 등을 받을때)

/**
   * Java는 모든 플렛폼에서 정수를 표현할 때 Big-Endian 방식을 사용한다.

   * Little-Endian을 사용하는 플렛폼에서 보낸 이진데이터를 받을 경우
     Big-Endian으로 변환하여 사용해야한다.

   * 다음은 자바에서 Big Little Endian변환을 수행하는 로직이다.
   */

public class Endian{
  /**
   * 자바에서 사용하는 Big-Endian 정수값을 Little-Endian 바이트 배열로 변환한다.
   */

  public static byte[] getLittleEndian(int v){
       byte[] buf = new byte[4];
       buf[3] = (byte)((v >>> 24) & 0xFF);
       buf[2] = (byte)((v >>> 16) & 0xFF);
       buf[1] = (byte)((v >>>  8) & 0xFF);
       buf[0] = (byte)((v >>>  0) & 0xFF);
       return buf;
  }
 
  /**
   * Little-Endian 바이트 배열을 자바에서 사용하는 Big-Endian정수로 변환한다.
   */
  public static int getBigEndian(byte[] v)throws Exception{
       int[] arr = new int[4];
       for(int i=0;i<4;i++){
            arr[i] = (int)(v[3-i] & 0xFF);
       }
       return ((arr[0]  << 24) + (arr[1]  << 16) + (arr[2]  << 8) + (arr[3]  << 0));
   }
}


C <--> JAVA 통신 설정시 잘못된 값이 나올수 있기 때문에, 이유 정도는 알아둘 필요가 있다.
이것이 구찮다면 전부 byte 로 보내자 ..;;

소스출처: http://blog.naver.com/joodong1027?Redirect=Log&logNo=130023035042 

2008년 11월 16일 일요일

[Linux] TCP Binary File 전송

바이너리 파일 전송은 전송하는 파일의 사이즈가 동일하여야 하는것은 당연한 것이다.
JAVA 라면 알아서 쉽게 해결되겠지만 C의 경우는 가끔 버퍼를 먹어버리거나 손실되는 경우가 발생되기때문에
사이즈를 정확하게 맞추기가 생각보다 까다롭다.( 절대 어렵다는 예기가 아님 ;;)

해당 방식은 서버로부터 파일사이즈를 먼저 받고 그 파일사이즈만큼 받는 방식이다.
상호 지정된 버퍼만큼 들어온다고 가정하고 파일의사이즈 를 루프를 돌면서 들어오는 버퍼의 양만큼 감산한다.
파일의 사이즈가 지정된 버퍼사이즈 보다 적을때는 남은 파일의사이즈 만큼만 받는다.
( 이렇게 하는 이유는 약간씩 오버헤드 또는 쓰레기 값이 들어올수 있게 되기때문에 파일사이즈가 불일치 할 확률이 매우 높아진다. )

server.c 소스

 

  ... 중략 ... 

 fsize = 0, nsize = 0, fpsize = 0;

 file = fopen("test.jpg","rb");

 fseek(file,0,SEEK_END);
 fsize = ftell(file);
 fseek(file,0,SEEK_SET);

 send(sd,&fsize,sizeof(fsize),0); // 파일의 사이즈를 보냄

 while(nsize != fsize){ // 파일을 보냄

  fpsize = fread(buf,1,MAXLINE,file);
  nsize = nsize + fpsize;
  send(sd,buf,fpsize,0);

} // end of while

fclose(file);

client.c 소스

 ... 중략 ...

filesize = 0;

file = fopen("test.jpg","wb");

recv(sd,&filesize,sizeof(filesize),0); // 파일의 사이즈를 받음

  bufsize = MAXLINE; // 기본 버퍼 설정

  while(filesize != 0){ // 받은 버퍼의 총사이즈가 파일의 사이즈와 같을때 까지 loop

      if(filesize < MAXLINE) // 남은 파일 사이즈가 버퍼보다 적을때
           bufsize = filesize;
   
      nbyte = recv(sd,buf,bufsize,0);

      filesize = filesize - nbyte;

      fwrite(buf,sizeof(char),nbyte,file);
      nbyte=0;

  } // end of while

  fclose(file);

2008년 11월 5일 수요일

TCP Server/Client (Fork)


Server.c

more..

Client.c

more..


 

Small Shell Version #1

1. background(&)를 구현하라.  
ex) 200500001$ ./a.out &

2. redirect(>), more(|)를 추가 구현하라.  
ex) 200500001$ ./a.out >output    
    200500001$ ./a.out | more



 shell.c

more..