관리 메뉴

Gyejoong's Information

서버 공용코드 (daytime,qotd,echo,finger) 본문

Study/Socket programming

서버 공용코드 (daytime,qotd,echo,finger)

연계중 2016. 9. 30. 19:55
반응형

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <unistd.h>

#include <arpa/inet.h>

#include <sys/socket.h>

 

void err_quit(const char *message);

void err_sys(const char *message);

#define MAXLINE 4096

 

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

{

// listen할 소켓 생성

int listenfd;

if( (listenfd = socket((AF_INET, SOCK_STREAM,0)) < 0)

err_sys("socket error");

 

// 서버주소와 소켓을 연결(bind)

struct sockaddr_in servaddr;

memset(&servaddr,0,sizeof(servaddr);

servaddr.sin_family = AF_INET;

servaddr.sin_port = htons(7,13,17,79); // echo,daytime,qotd,finger 순으로 포트번호설정.

servaddr.sin_addr.s_addr = htonl(INADDR_ANY);    // 호스트주소를 네트워크주소로 long형으로 변환

if (bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr)) < 0)

err_sys("bind error");

 

// 소켓을 리슨 소켓으로 변경 (listen)

if(listen(listenfd,SOMAXCONN) < 0)

err_sys("listen error");

 

for ( ; ;) {

// 클라이언트 접속 및 대기처리 (accept)

int connfd;

struct sockaddr_in cliaddr;    // 클라이언트의 주소

socklen_t len = sizeof(cliaddr);

if ( (connfd = accpet(listenfd,(struct sockaddr*)&cliaddr,&len)) < 0)

err_sys("accept error");

 

// 접속한 클라이언트의 정보를 화면에 출력

char cliname[INET_ADDRSTRLEN];

if ( inet_ntop(AF_INET,&cliaddr.sin_addr,cliname,sizeof(cliname)) )

printf("Handling client %s:%d\n",cliname, ntohs(cliaddr.sin_port));

else

err_sys("inet_ntop error");

}

 

close(connfd); // 클라이언트의 접속 끊기

}

void err_quit(const char *message)

{

fputs(message,stderr);

fputc('\n',stderr);

exit(1);

}

void err_sys(const char *message)

{

perror(message);

exit(1);

}

반응형
Comments