08년 6월 4일

winsock을 이용한 파일 보내기(C++) 소스

 

#include<winsock2.h>

#include<stdio.h>

#include<stdlib.h>

 

#define BUFSIZE 4096

 

// 소켓 함수 오류 출력 후 종료

void err_quit(char *msg)

{

           LPVOID lpMsgBuf;

           FormatMessage(

                     FORMAT_MESSAGE_ALLOCATE_BUFFER|

                     FORMAT_MESSAGE_FROM_SYSTEM,

                     NULL, WSAGetLastError(),

                     MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),

                     (LPTSTR)&lpMsgBuf, 0, NULL);

           MessageBox(NULL, (LPCTSTR)lpMsgBuf, msg, MB_ICONERROR);

           LocalFree(lpMsgBuf);

           exit(-1);

}

 

// 소켓 함수 오류 출력

void err_display(char *msg)

{

           LPVOID lpMsgBuf;

           FormatMessage(

                     FORMAT_MESSAGE_ALLOCATE_BUFFER|

                     FORMAT_MESSAGE_FROM_SYSTEM,

                     NULL, WSAGetLastError(),

                     MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),

                     (LPTSTR)&lpMsgBuf, 0, NULL);

           printf("[%s] %s", msg, (LPCTSTR)lpMsgBuf);

           LocalFree(lpMsgBuf);

}

 

int main(int argc, char *argv[])

{

 

    int err;

 

           if(argc < 2){

                     fprintf(stderr, "Usage: %s <FileName>\n", argv[0]);

                     return -1;

           }

 

          

           WSADATA wsa;

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

                     return -1;

 

           SOCKET senderSock = socket(AF_INET,SOCK_STREAM, 0);

    if(senderSock == INVALID_SOCKET){

                                             err_quit("socket()");

                                                                                               }

          

           // connect()

           SOCKADDR_IN senderaddr;

           ZeroMemory(&senderaddr,sizeof(senderaddr));

           senderaddr.sin_family = AF_INET;

           senderaddr.sin_port = htons(9000);

           senderaddr.sin_addr.s_addr = inet_addr("127.0.0.1");

          

           err = connect(senderSock, (SOCKADDR *)&senderaddr,sizeof(senderaddr));    

           if(err == SOCKET_ERROR) err_quit("connect()");

 

 

           //파일 열기

           FILE *fp = fopen(argv[1],"rb");

 

           if(fp== NULL)

           {

            perror("파일 입출력 오류");

            return -1;

           }

 

           //파일 이름 보내기

           char filename[256];

           ZeroMemory(filename,256);

           sprintf(filename,argv[1]);

           err = send(senderSock,filename,256,0);

           //if(err == SOCKET_ERROR) err_quit("send()");

 

 

           //파일 크기 얻기

           fseek(fp,0,SEEK_END);//파일 포인터를 파일의 끝으로 옮김

           int totalbytes = ftell(fp);

 

           printf("크기 :%d bytes\n",totalbytes); //ansi로 된 text파일에 있는 문자

 

           err = send(senderSock,(char *)&totalbytes,sizeof(totalbytes),0);

           if(err == SOCKET_ERROR) err_quit("send()");

 

 

           //파일 데이터 전송에 사용할 변수

           char buf[BUFSIZE];

           int numread;

           int numtotal = 0;

 

           //파일 데이터 보내기

 

           rewind(fp); // 파일 포인터를 제일 앞으로 이동

           while(1){

                     numread = fread(buf, 1, BUFSIZE, fp);

                     if(numread > 0){

                                err = send(senderSock, buf, numread, 0);

                                if(err == SOCKET_ERROR){

                                          err_display("send()");

                                          break;

                                }

                                numtotal += numread;

                     }

                     else if(numread == 0 && numtotal == totalbytes){

                                printf("파일 전송 완료!: %d 바이트\n", numtotal);

                                break;

                     }

                     else{

                                perror("파일 입출력 오류");

                                break;

                     }

           }

 

           fclose(fp);         

    closesocket(senderSock);

           WSACleanup();

 

return 0;

 

}

 

 

by Good_Leo | 2008/06/04 17:57 | Image Perception | 트랙백 | 덧글(0)

08년 6월 2일

l  scanf : ‘\n’까지 문자열에 포함 

l  fgets : ‘\n’까지 문자열에 포함 X

 

문자열 상수

두 개 이상의 문자가 모여 있는 것을 문자열이라고 한다. 문자열 상수는 이중인용부호

(" " )를 사용하여 표기한다. C 에서는 이를 기본 데이터형으로 제공하지 않는다

(C에서 스트링은 문자 유형의 배열로 처리하고 있다. )
-
문자열 끝에 null string('\0')이 추가되어 그 끝을 알 수 있도록 함

 

gets()는표준 입력(stdin)으로부터 개행 문자나 EOF로끝나는 한 라인을 입력 받아서 s가가리키는 버퍼에 저장하고 마 지 막 을 '\0'로 변경한다. 그러나 버퍼 오버 플로우에 대한 검사를 하지는 않는다. (이 점에 대해서는 아래의 버그를보기 바란다.)

 

버그


결코 gets()를 사용하지 마라. gets()가 얼마나 많은 문자를읽 어 들일 지 사전에 알 수 없고, 그로 인해 gets()가 버퍼의 용량을넘어서는 범위에 문자를 저장할 위험이 있다. 그 러 므 로 gets() 를사용하는 것은 컴퓨터 보안에 치명적인 타격을 줄 수 있다. (버퍼 오버 플로우를 이용한 해킹이 가능하다. - 역주) 대신 fgets()을사용하는 것이 좋다.

여기에서 설명한 함수의 입력 스트림을 stdio 라이브러리의로우-레벨 시스템 콜인 read()의 파일 디스크립터와 공유해서 사용 하는 것은 결코 추천할 만한 일이 아니다. 그 결과가 정의되어 있지 않아서 의도하지 않은 방향으로 동작할 가능성이 크기 때문이다

 

 

 fseek

 ftell

 rewind(fp);

 

 

UTF-8 인코딩은 유니코드 한 문자를 나타내기 위해 1바이트에서 4바이트까지를 사용한다. 예를 들어서, U+0000부터 U+007F 범위에 있는 ASCII 문자들은 UTF-8에서 1바이트만으로 표시된다. 4바이트로 표현되는 문자는 모두 기본 다국어 평면(BMP) 바깥의 유니코드 문자이며, 거의 사용되지 않는다.

 

유니코드의 목적은 현존하는 문자 인코딩 방법들을 모두 유니코드로 교체하려는 것이다. 기존의 인코딩들은 그 규모나 범위 면에서 한정되어 있고, 다국어 환경에서는 서로 호환되지 않는 문제점이 있었다. 유니코드가 다양한 문자 집합들을 통합하는 데 성공하면서 유니코드는 컴퓨터 소프트웨어국제화지역화에 널리 사용되게 되었으며, 비교적 최근의 기술인 XML, 자바, 그리고 최신 운영 체제 등에서도 지원하고 있다.

 

Unicode 자체는 자신을 표현하는 방법이 정의되지 않은 매치 테이블(1~1048576)일 뿐이며, 표현하는 방법은 다양. 대표적으로 UTF-8, UTF-16

 

ASCII의 특징은 영문, 숫자의 한 글자를 1byte로 하며, 한글 완성형 인코딩인 euc-kr에서 한글, 한자의 한 글자를 2byte로 합니다. 일반적으로 확장된 인코딩은 영문, 숫자, 특수문자, 공백, 영어를 제외한 하나의 외국어만을 포함하고 있어 여러 언어를 표현하기 어렵습니다.(참고로, euc-kr이 일본어를 포함하고 있긴합니다만 모두를 포함하고 있는것 같진 않습니다.)

 

http://www.hno3.pe.kr/wp/archives/75

http://mwultong.blogspot.com/2006/10/xp-ansi-notepad-encoding.html

 

Q: 메모장에서, "다른 이름으로 저장"할 때, ANSI 인코딩의 의미는?

 

한글 윈도우에서, ANSI 인코딩은 그냥 평범한 "한글 확장완성형 코드"를 의미합니다. 대부분의 경우 ANSI 인코딩으로 저장하면 됩니다.

 

 

메모장의 인코딩 목록에는 다음과 같은 약간 특수한 인코딩도 있습니다.

 

* 유니코드 : 윈도우에서 사용되는 16비트 유니코드. 정확한 이름은 UTF-16LE

 

* 유니코드(big-endian) : 윈도우에서는 사용되지 않는 16비트 유니코드. 정확한 이름은 UTF-16BE

 

* UTF-8 : 인터넷 웹페이지(HTML) 등을 만들 때 사용되는 8비트 유니코드

 

만약 HTML 문서를 유니코드로 만들 때에는 반드시 UTF-8 로 저장해야 합니다.

MS오피스와 관련되어 유니코드 파일을 만들려면 "유니코드"로 저장합니다.

 

"유니코드(big-endian)"을 인식하는 프로그램은 그리 많지 않습니다. 특별한 이유가 없는 이상 "유니코드(big-endian)"으로 저장하면 곤란합니다.

 

결론

 

다른 이름으로 한글 텍스트 파일을 저장 (Save As) 할 때에는, ANSI 인코딩으로 저장하면 됩니다.

 

 

데이터 통신

 

 

Client

 

#include <winsock2.h>

#include <stdlib.h>

#include <stdio.h>

 

#define BUFMAX 512

 

int main()

{

           int retval;

 

           // 윈속 초기화

           WSADATA wsa;

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

                     return -1;

 

           // socket()

           SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);

 

           // connect()

           SOCKADDR_IN serveraddr;

           ZeroMemory(&serveraddr, sizeof(serveraddr));

           serveraddr.sin_family = AF_INET;

           serveraddr.sin_port = htons(9000);

           serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");

           retval = connect(sock, (SOCKADDR *)&serveraddr, sizeof(serveraddr));

          

           if(retval == 0) printf("접속");

 

           //데이터 통신에 사용될 변수

 

           char buf[BUFMAX+1];

           int len;

 

           //서버와 데이터 통신

 

           while(1)

           {

           //데이터 입력

           ZeroMemory(buf,sizeof(buf));

          

 

           //scanf("%s",buf);

 

           fgets(buf,BUFMAX+1,stdin);

 

           // '\n'문자 제거 :

           len = strlen(buf);

          

           if(buf[len-1] =='\n')

           {

                     buf[len-1] = '\0';

           }

 

           printf("\n");      

          

           //send  

           //send(sock,buf,strlen(buf),0);

           send(sock,buf,strlen(buf),0);

 

           //accept

 

           retval = recv(sock,buf,sizeof(buf),0);

           buf[retval] = '\0'; // ‘\0’ 삽입 : Server에서 보낸 data의 마지막에 ‘\0’ 삽입

           printf("%s\n",buf);

 

           }

          

           closesocket(sock);

           return 0;

 

}

 

by Good_Leo | 2008/06/04 01:26 | Image Perception | 트랙백 | 덧글(0)

08년 5월 30일

WSADATA 구조체

 

Windows Sockets 초기화 정보를 저장하기 위해 사용되고 AfxSocketInit함수 호출에 의해 구조체의 포인터가 리턴된다.

 

struct WSAData {

   WORD wVersion;                             //Windows Sockets의 버전

   WORD wHighVersion;             //DLL이 제공하는 WinSock의 가장 상위버전

   char szDescription[WSADESCRIPTION_LEN+1];    

   char szSystemStatus[WSASYSSTATUS_LEN+1];

   unsigned short iMaxSockets;    //open할 수 있는 최대소켓 수

   unsigned short iMaxUdpDg;     //UDP로 받을 수 있는 최대 메시지 크기

   char FAR * lpVendorInfo;

};

 

WSAStartupWinsock DLL(WS2_32.DLL)을 사용할 수 있도록 초기화하는데 사용하는 함수

 

int WSAStartup(

  __in  WORD wVersionRequested, //2Bytes의 상위바이트는 minor버전, 하위바이트는 major버전

  __out  LPWSADATA lpWSAData

);

 

가장 먼저 수행되어야 할 함수

 

윈도우 소켓을 사용할 필요가 없을때 WSACleanup함수가 호출되어야 한다. 그래야만 Windows Sockets에 할당되었던 리소스들을 해제 할 수 있다. SOCKADDR_IN

 

struct sockaddr_in{

        short                  sin_family;

        unsigned short    sin_port;

        struct  in_addr     sin_addr;

        char                   sin_zero[8];

};

소켓이 접속해 있는 로컬 또는 원격지 주소를 표현하는데 사용

 

by Good_Leo | 2008/05/31 11:26 | Image Perception | 트랙백 | 덧글(0)

08년 5월 22일

고유 얼굴을 이용하여 얼굴을 인식

 

1. 인식후보 얼굴 벡터 집합(S)의 구성

2. 이미지 정규화

3. 평균얼굴 벡터 계산Ψ

4. 각 인식후보 얼굴 벡터와 평균얼굴 벡터의 차 벡터 계산

5. N2 X1 벡터 로부터 공분산행렬 계산

by Good_Leo | 2008/05/31 11:23 | 트랙백 | 덧글(0)

08년 5월 21일

패턴 인식 개론: 특징 벡터 차원의 축소

 

특징벡터:

 

특징(어떤 객체와 분류될 수 있는 고유의 특성)을 하나 이상의 수치 값으로 가질 경우 특징 벡터라고 하는 d-차원의 열 벡터로 표현된다.

 

특징이 많으면 - 잡음 특징들까지 포함되므로 오히려 분류에 좋지 않다.

-       패턴 분류기에 의한 학습과 인식 속도가 느려진다

-       모델링에 필요한 학습 집합의 크기가 커진다

 

1. 데이터 시각화:

고차원 데이터의 분포를 2차원, 3차원 공간상으로 시각화시키고자 할 때 PCA가 사용된다.

) 2차원 축소시 PCA를 이용해 처음 두 개의 주축(X’, Y’)을 구한 후, 이 주축으로 차원을 축소시키고, 이 주축을 기준으로 데이터의 추정 분포를 보여줄 수 있다.


2.
특징 추출:
고차원 데이터에 대한 분류기 설계시 적은 양의 표본으로 분류기를 설계하는데 PCA가 사용된다.

 

실습1]

1. x, y
좌표상에 생성된 랜덤값 그리기


R1=rand(1000,2); // 1000 x 2
벡터 R1 생성

figure; //그래프 화면 객체 생성

plot(R1(:,1),R1(:,2),'r*'); //R1의 모든 행, 모든 1 : x

                    //R1의 모든 행, 모든 2 : y

axis('square'); // x,y축을 정사각형으로 바꿈

 

 

 

2. mean함수로 x, y 평균이 0이 되도록 원 데이터의 집합을 재배치

 

R1_Mean = [mean(R1(:,1)),mean(R1(:,2))];

//mean으로 x, y축의 평균이 0이 되도록 집합 재배치

Rctr = [R1(:,1)-R1_Mean(:,1), R1(:,2)-R1_Mean(:,2)];

plot(Rctr(:,1), Rctr(:,2), 'r*');

 

  

3. 원점에서 반경 0.5보다 멀리 떨어진 Rctr에 있는 점들은 제거한 후 0.5 원안에 있는 점들을  다시 그림

 

for i=1:1000

   if ((sqrt(Rctr(i,1)^2 + Rctr(i,2)^2)) >0.5)

       for j=1:2

       Rcirc(i,j)=0; //

       end

   else

       for j=1:2

       Rcirc(i,j)=Rctr(i,j);

       end
end
end
plot(Rcirc(:,1),Rcirc(:,2),'r*');

 

4. cov, eig 를 이용하여 공분산 행렬과 고유값, 고유행렬을 구한다

 

        고유 얼굴을 이용하여 얼굴을 인식

 

1. 인식후보 얼굴 벡터 집합(S)의 구성

2. 이미지 정규화

3. 평균얼굴 벡터 계산Ψ

4. 각 인식후보 얼굴 벡터와 평균얼굴 벡터의 차 벡터 계산

5. N2 X1 벡터 로부터 공분산행렬 계산

by Good_Leo | 2008/05/31 11:22 | 트랙백 | 덧글(0)

◀ 이전 페이지          다음 페이지 ▶