#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

+ Recent posts