#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 |