python 스터디를 하던 도중 이 사이트를 추천해주었고, 과제로 문제푸는게 나옴.

 

첫단계를 보자마자 C와 달리 저런 숫자를 넣어도 오버플로우가 발생하지 않고 값이 잘나온다고 홍보하는것 같았지만 문제니까...

 

>>>2**38 2의 38 혹은  >>>pow(2,38)을 하면

 

간단하게 URL에 값을 넣고 다음단계로 넘어가자

 

 

'Programming > Python' 카테고리의 다른 글

Python Challenge 4  (0) 2012.05.23
Python challenge 3  (1) 2012.05.23
Python challenge 2  (0) 2012.05.23
Python challenge 1  (0) 2012.05.15
Python Method  (0) 2012.05.15

maketrans(x, [y, [z]])

This method returns a translation table that maps each character in the intab string into the character at the same position in the outtab string. Then this table is passed to the translate() function. Note that both intab and outtab must have the same length.

라고 써져있는데.. 음.. 테이블맵에 맞춰서 변환해준다는 것같다. 테이블맵을 짠후에는 translate()함수를 사용하여, 문자열을 바꿔주는 함수.

 

Maketrans(table [,deletechars])

- translate()함수에 쓰일 번역용 맵을 반환

- 인자가 하나일 경우 사전형식 입력

- 인자가 둘인경우 길이가 같은 문자열을 입력받아 x의 문자가 y로 변환

- 인자가 셋인경우 x가 y로 변환되고 z문자가 None으로 대체(삭제)

 

Help on built-in function translate:

translate(...)
    S.translate(table [,deletechars]) -> string
   
    Return a copy of the string S, where all characters occurring
    in the optional argument deletechars are removed, and the
    remaining characters have been mapped through the given
    translation table, which must be a string of length 256 or None.
    If the table argument is None, no translation is applied and
    the operation simply removes the characters in deletechars.

 

ex)

>>>a= "abcd"

>>>b=string.maketrans("abcd","efgt")

>>>c = a.translate(b)

>>>c

'efgt'

>>>

 

 

대부분의 사이트와 블로그에선 str.maketrans로 나오지만 내 우분투(11.10)파이썬(2.7.2)에서는 명령어가 먹히지 않았다. 대신 string.maketrans 를 사용해야함.

'Programming > Python' 카테고리의 다른 글

Python Challenge 4  (0) 2012.05.23
Python challenge 3  (1) 2012.05.23
Python challenge 2  (0) 2012.05.23
Python challenge 1  (0) 2012.05.15
Python challenge 0  (0) 2012.05.15

#include<stdio.h>
#include<unistd.h>
#include<sys/socket.h>
#include<string.h>
#include<arpa/inet.h>
#include<stdlib.h>

 

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

        char buf[100],ip;
        int sock_serv,sock_clin,i;
        struct sockaddr_in serv_adr,clin_adr,test;
        int str_len;
        FILE *fp;
        socklen_t adr_sz;
        pid_t pid;

 

        if(argc != 2)
                printf("Please Input <Port>");

 

        sock_serv=socket(PF_INET,SOCK_STREAM,0);
        memset(&serv_adr,0,sizeof(serv_adr));
        serv_adr.sin_family=AF_INET;
        serv_adr.sin_port=htons(atoi(argv[1]));
        serv_adr.sin_addr.s_addr=htonl(INADDR_ANY);

 

        if(bind(sock_serv,(struct sockaddr*)&serv_adr,sizeof(serv_adr))==-1)
                printf("bind error()");
        if(listen(sock_serv,5)==-1)
                printf("listen error()");

 

        while(1){
                adr_sz=sizeof(clin_adr);
                sock_clin=accept(sock_serv,(struct sockaddr*)&clin_adr,&adr_sz);
                memset(&test,0,sizeof(test));                
                getpeername(sock_clin,(struct sockaddr *)&test,&adr_sz);

//클라이언트의 주소정보를 getpeername함수를 이용하여 test구조체에 저장한다.


                if(sock_clin==-1){
   }
                else{
                        printf("Accept at : %s!!\n",inet_ntoa(test.sin_addr)); //클라이언트의 ip출력.
                        pid=fork();
                        if(pid==0){            //자식프로세스 영역.
                                close(sock_serv);
                                while(str_len=read(sock_clin,buf,100)!=0){
                                i=strlen(buf);
                                write(sock_clin,buf,i);
                                fp=fopen("test.txt","a");        //test.txt파일을 열고.
                                fprintf(fp,"%s\t%s",inet_ntoa(test.sin_addr),buf);  //클라이언트의 ip와 buf저장.
                                fclose(fp);
                                }
                                close(sock_clin);
                                printf("Clinet disconnected\n");
                        }
                        else
                                close(sock_clin);
                }
        }
        close(sock_serv);
        return 0;
}

 

 

test.txt를 살펴보니.

127.0.0.1과 203.x.x.x에서 접속을 했고, 입력했던 문자열이 저장되어 있다.

 

'Programming > Socket' 카테고리의 다른 글

Select 함수  (0) 2012.05.16
I/O 멀티플렉싱  (0) 2012.05.15
클라이언트 IP 가져오기  (0) 2012.05.14
멀티프로세스 소스  (0) 2012.05.10
멀티프로세스 서버  (0) 2012.05.08

서버소켓에서 나에게 접속한 클라이언트 IP를 가져오는 함수가 존재한다.

로그파일을 만들 때 사용하는 건가?

 

int Getpeername( sock, struct sockaddr* name, int *size )

sock : IP를 알고자 하는 소켓의 파일 디스크립터. 
struct sockaddr* name : 소켓 정보를 저장할 sockaddr_in구조체

int *size : 구조체 사이즈.

 

ex)

struct sockaddr_in test_adr;

 

adr_sz=sizeof(clin_adr);

getpeername(sock,(struct sockaddr*)&test_adr,&adr_sz);

 

위와 같이 선언한다면, test_adr구조체 변수안에 접속한 클라이언트의 정보가 기록된다.

하지만 위와 같이 선언하고 출력해보면.

 

우리가 알수 없는 정수형으로 값이 저장되어 있다.

 

sockaddr_in 구조체의 주소멤버의 데이터 타입은 unsigned long이다.

따라서 네트워크바이트 순서인 32비트 값을 변환시켜주어야 한다.

 

이러한 경우에 사용하는 함수가 inet_ntoa()함수이다.

 

char *inet_ntoa(struct in_addr addr)

 

성공시 변환된 해당 문자열의 포인터를 반환하고, 실패할 경우에는 -1을 반환한다.

 

 


'Programming > Socket' 카테고리의 다른 글

I/O 멀티플렉싱  (0) 2012.05.15
로그파일을 남기는 서버  (0) 2012.05.14
멀티프로세스 소스  (0) 2012.05.10
멀티프로세스 서버  (0) 2012.05.08
소켓의 옵션  (0) 2012.05.07

echo_server.c

 

 

#include<stdio.h>
#include<unistd.h>              //pid_t,socklen_t,read,write,close etc...
#include<sys/socket.h>          //socket,accept,bind,listen, etc...
#include<stdlib.h>
#include<arpa/inet.h>           //INADDR_ANY,sockaddr_in
#include<string.h>

int main(int argc,char *argv[])
{
        struct sockaddr_in serv_adr,clnt_adr;   
        int sock_ser,sock_clnt;
        char buf[100];
        pid_t pid;
        socklen_t adr_sz,len;

 

        sock_ser = socket(PF_INET,SOCK_STREAM,0);
        memset(&serv_adr,0,sizeof(serv_adr));            //소켓구조체 초기화
        serv_adr.sin_family=AF_INET;                        //서버소켓의 주소체계 결정
        serv_adr.sin_port = htons(atoi(argv[1]));        //서버포트 결정
        serv_adr.sin_addr.s_addr = htonl(INADDR_ANY); //서버의 아이피로는 가지고 있는 아이피중 임의의 하나로 설정한다는 뜻.

 

        if(bind(sock_ser,(struct sockaddr *)&serv_adr,sizeof(serv_adr))==-1)    

//생성한 소켓에 ip,port,주소체계를 설정해준다.
                printf("bind() error\n");
 if(listen(sock_ser,5)==-1)        //서버에 연결가능도록 해줌.
            printf("listen error\n");
  while(1){
            adr_sz = sizeof(clnt_adr);
            sock_clnt = accept(sock_ser,(struct sockaddr*)&clnt_adr,&adr_sz);//클라이언트의 접속허용
            if(sock_clnt== -1){ //접속이 없다면 아무런 일도 하지않는다.

                   }

                else{                        //접속이 들어온다면,
                        printf("accept !!\n");
                        pid=fork();        //자식프로세스를 생성한 후에,
                        if(pid==0){        //서버소켓의 파일디스크립터를 닫고,
                                close(sock_ser);
                                while((len=read(sock_clnt,buf,100))!=0)    //데이터를 읽어들이고,
                                        write(sock_clnt,buf,len);                //다시클라이언트에게 보내준다.
                                close(sock_clnt);                                //클라이언트 소켓을 소멸시킴.
                                printf("disconnected socket...\n");
                    }
                  else    close(sock_clnt);                            //부모프로세스는 클라이언트의 디스크립터를 닫는다.
                }
        }
        close(sock_ser);        //서버 소켓 소멸.
        return 0;
}

 

 

echo_client.c

 

#include<stdio.h>
#include<arpa/inet.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<unistd.h>
#include<string.h>

int main(int argc,char *argv[])
{
        int sock_clin;
        struct sockaddr_in serv_adr,clnt_adr;
        socklen_t len;
        char buf[100];

 

        sock_clin=socket(PF_INET,SOCK_STREAM,0);    //소켓 생성과 필요한정보할당.
        memset(&clnt_adr,0,sizeof(clnt_adr));
        clnt_adr.sin_family=AF_INET;
        clnt_adr.sin_addr.s_addr=inet_addr(argv[1]);
        clnt_adr.sin_port=htons(atoi(argv[2]));

 

        if(connect(sock_clin,(struct sockaddr *)&clnt_adr,sizeof(clnt_adr))==-1)    

//소켓에 적혀있는 아이피와 포트번호를 보고 접속을 시도함.
        printf("connected error\n");

        printf("Connected!!...\n");
        while(1){
                if((strcmp(buf,"q\n"))==0 || (strcmp(buf,"Q\n")==0))    //q,Q를 입력하면 종료됨.
                break;
                printf("Input Message : ");
                fgets(buf,100,stdin);        //문자열을 입력받고,
                write(sock_clin,buf,sizeof(buf));        //서버에 데이터를 전송,
                read(sock_clin,buf,100);                    //read를 호출하면, 서버로 부터 데이터를 읽어들일 때까지 기다리다가 다음 명령어가 실행되므로, write바로 다음에 read를 쓴다고 해서 서버로부터 응답이 늦게온다고 데이터를 받지 못하는 현상은 일어나지 않는다.
                printf("Message From server : %s\n",buf);    //출력.
        }
        close(sock_clin);            //소켓 소멸.
        return 0;
}

'Programming > Socket' 카테고리의 다른 글

로그파일을 남기는 서버  (0) 2012.05.14
클라이언트 IP 가져오기  (0) 2012.05.14
멀티프로세스 서버  (0) 2012.05.08
소켓의 옵션  (0) 2012.05.07
TCP server 함수호출 순서.  (0) 2012.04.25

멀티 프로세스 서버란, 한번에 하나의 클라이언트에게만 서비스를 제공하는게 아니라 동시에 둘 이상의 클라이언트에게 서비스를 제공하는 서버이다.

 

 

그림처럼 클라이언트의 서비스 요청이 있을 때마다 서버는 자식 프로세스를 생성해서 서비스를 제공한다. 즉, 서비스를 요청하는 클라이언트의 수가 다섯이라면 서버는 추가로 다섯 개의 자식 프로세스를 생성해서 서비스를 제공한다.

이때 자식프로세스를 생성할 때 fork()함수를 사용하는데, fork()함수를 사용하게 되면 부모프로세스의 값을 그대로 복사하기 때문에 파일디스크립터도 복사되서 부모에서 따로 자식에게 소켓의 파일디스크립터를 넘길 필요가 없다.

 

부모 프로세스에서 자식프로세스를 생성하고 파일디스크립터를 넘겨받은 직후의 모습은.

 

이러한 식으로 하나의 소켓에 두개의 파일 디스크립터가 존재하는 경우, 두개의 파일 디스크립터가 모두 소멸되어야 소켓도 소멸된다. 따라서 위와 같은 형태를 유지하면, 자식프로세스가 클라이언트와 연결되어 있는 소켓을 소멸하려 해도 소멸되지 않고 남아있게 된다. 따라서 fork()함수 호출이 후에는 서로에게 상관이 없는 소켓의 파일 디스크립터를 닫아주어야 함.

 

 

 

'Programming > Socket' 카테고리의 다른 글

클라이언트 IP 가져오기  (0) 2012.05.14
멀티프로세스 소스  (0) 2012.05.10
소켓의 옵션  (0) 2012.05.07
TCP server 함수호출 순서.  (0) 2012.04.25
Socket 함수 구조체  (0) 2012.04.24

함수 포인터란?

함수 포인터는 함수의 주소값을 저장하는 포인터이다.

함수의 시작주소값을 가지는 포인터로써, 가르키는 함수의 반환형과 매개변수의 타입이 맞아야만 주소를 저장할 수 있다.

 

int (*ptr)(int)라는 함수 포인터가 있다면,

 

int function(int tmp) 처럼 생긴 포인터를 가르킴. 즉,

 

 

같은 색상의 밑줄끼리는 같은 타입이어야 함수 포인터로 주소값을 저장할 수 있다.

 

함수포인터를 이용한 간단한 예제.

 

실행 화면.

 

 

또한 함수포인터는 typedef 로 미리 선언해 줄수가 있다.

 

#include<stdio.h>

 

typedef int(*ptr)(int)

 

int main()

{

ptr ptr;

 

이런 식으로 미리 선언이 가능하다. 실제로도 이렇게 많이 사용한다고 함.

 

'Programming > C' 카테고리의 다른 글

열거형 enum  (0) 2012.07.09
sscanf , sprintf  (0) 2012.07.06
문자열 붙이기 Strcat()  (0) 2012.07.04
Strtok 문자열 자르기  (0) 2012.06.29
Extern 함수  (0) 2012.05.21

 

 

위 표에서 보이듯이 소켓의 옵션은 계층별로 분류된다. IPPROTO_IP 레벨의 옵션들은 IP프로토콜에 관련되며 IPPROTO_TCP레벨의 옵션은 TCP프로토콜에 관련된 사항이다. SOL_SOCKET옵션들은 소켓에 대한 가장 일반적인 옵션들이다.

 

각각의 옵션을 참조하거나 설정할 때에는 함수를 이용해야 하는데 이떄 이용하는 함수가

 

getsockopt & setsockopt이다.

 

#include<sys/socket.h>에 선언되어 있다.

 

int getscokopt(int sock,int level, int optname, void *optval, socklen_t *optlen);

성공시 0, 실패시 -1 반환

 

sock -> 옵션 확인을 위한 소켓의 디스크립터 전달.

level -> 확인할 옵션의 프로토콜 레벨 전달.

optname -> 확인할 옵션의 이름 전달.

optval -> 확인결과의 저장을 위한 버퍼의 주소값 전달.

optlen -> 네번째 매개변수 optval 로 전달된 주소 값의 버퍼크기를 담고있는 변수의 주소 값 전달, 함수호출이 완료되면 이 변수에는 네번째 인자를 통해 반환된 옵션정보의 크기가 바이트 단위로 계산되어 저장된다.

 

int setsockopt(int sock, int level, int optname, const void* optval, socklen_t optlen);

성공시 0 실패시 -1반환.

 

sock -> 옵션변경을 위한 소켓의 파일 디스크립터 전달.

level -> 변경할 옵션의 프로토콜 레벨 전달.

optname -> 변경할 옵션의 이름 전달.

optval -> 변경할 옵션정보를 저장한 버퍼의 주소 값 전달.

optlen -> 네번째 매개변수 optval로 전달된 옵션정보의 바이트 단위 크기 전달.

 

몇가지 살펴보면, SO_SNDBUF와 SO_RCVBUF는 입출력 버퍼를 제어할 때 사용하는 함수이고, SO_REUSEADDR 함수는 서버측에서 time-wait 상태가 발생하였을떄 이 값을 1(TURE)로 바꾸어 주면 bind error가 뜨지 않고 바로 주소를 재할당해 줄 수가 있다.

또한 TCP소켓에 기본설정으로 Nagle 알고리즘이 설정되어 있는데 이는 때때로 옵션을 풀어줘야 하는 경우가 생긴다. 이때 사용하는 함수가 TCP_NODELAY이다. 이때는 반대로 값을 1로 바꿔 주어야 한다.

 

<Nagle 알고리즘 >

'Programming > Socket' 카테고리의 다른 글

클라이언트 IP 가져오기  (0) 2012.05.14
멀티프로세스 소스  (0) 2012.05.10
멀티프로세스 서버  (0) 2012.05.08
TCP server 함수호출 순서.  (0) 2012.04.25
Socket 함수 구조체  (0) 2012.04.24

윈도우 CMD를 다루다 보면 리눅스 Shell환경과 명령어가 약간의 차이가 있어 다소 불편함을 느낀다.


그런 분들에게 추천하는 Power Shell!! 윈도우 7에는 자동으로 깔려있는 것같은데.. 

오늘 처음 본 power shell 인데 


이런 모양으로 생겼다.


간단하게 ls만 쳐봤는데도 리눅스처럼 실행도 되고 출력도 리눅스와 흡사하게 나온다.

아직 ls만 쳐보고 신기해서 바로 포스팅이라 다른 리눅스 명령어도 되는지는 모르겟지만. 일단 CMD와 비슷하고 리눅스명령어도 알아듣는 것 같아서 신기하다 ㅋㅋㅋ


다만 CMD보다 좀 무겁다는

'etc' 카테고리의 다른 글

파일 시그니쳐 모음  (0) 2013.03.05
IDA Pro + Hex ray  (0) 2013.03.04
Window Beep 제거  (0) 2012.09.13

Classic Problems of Synchronization

 

Classic Problems of Synchronization에는 몇가지가 있는데.

 

1.The Bounded -Buffer Problem

 

2. The Readers - Writers Problem

 

이다.

 

1. Bounded - Buffer Problem

 

공유버퍼를 가지고  한쪽에서는 데이터를 입력하고 (Producer) 다른 한쪽에서는 데이터를 받아보기만 하는(Consumer) 두 프로세스의 동기화 방법이다.

Mutex로 크리티컬 섹션을 구별하기 위해 사용하고, Full,empty 변수로 입력이가능한지 혹은 데이터가 버퍼안에 들어있는지를 판단한다.

 

 

2.Reader and Writer Problem

 

공유데이터를 여러명이 보기만 하는 것은 상관이없으나, 쓰는도중에 보는 것은 문제가 된다. 이러한 동기화 문제를 해결하기 위해서 세마포어 변수로 wrt와 mutex를 사용하고, int readcount를 하나 더 설정한다.

readcount== 0 이라면 읽는 사람이 없는 것이므로 데이터를 수정하거나 새로 쓰는 것이 가능하지만, 누군가가 읽고 있다면, readcount!=0이라면 수정을 할 수가 없도록 wait(wrt)를 걸어 프로세스를 lock한다.

 

 

Monitor

 

프로그래밍 언어에서 지원. , 프로그램 라이브러리 형태로 지원하는 것.

) Concurrent Pascal, Pascal-plus, Modula-2, Modula-3

세마포어와 비슷한 기능을 하지만 제어하기가 용이함

모니터는 모니터 lock를 이용하여 Linked-list 전체를 lock하거나, 각 리스트 은 각 리스트의 원소 하나하나에 대해 lock을 걸 수 있음

condition variable을 이용하여 하나를 제외한 프로세스를 모니터 큐에 넣는다.

 

Monitor 특징

1. Local data 변수는 모니터 자체의 프로시저에 의해서만 접근이 가능하며, 부 프로시저는 접근할 수 없다.

 

2. 임의의 프로세스는 모니터 프로시저 중 하나를 호출함으로써 모니터 내부로 진입할 수 있음

 

3.  어느 한 순간에 단 하나의 프로세스만이 모니터 내부에 진입할 수 있음. , 모니터를 호출한 다른 프로세스들은 모니터를 접근할 수 있을 때까지 기다리면서 수행이 일지 정지됨

'O.S' 카테고리의 다른 글

Flag Register  (0) 2012.07.20
Mutex  (0) 2012.05.16
Synchronization Hardware  (0) 2012.04.27
Semaphore  (0) 2012.04.27
파일 디스크립터(File descriptor)  (0) 2012.04.24

+ Recent posts