- 이 Server는, Client로 접속했을 때 입력한 값을 그대로 돌려주는 Echo Server이다.
- vi editor를 이용해서 아래의 source code를 입력한 후 Shift + Z + Z로 저장한다.
- gcc를 이용하여 컴파일 한 후 Client보다 먼저 실행한다.
- 이 때 파일명 뒤에 port number를 입력해주게 되는데, 이 port number는 Client와 같아야 한다.
- ex) vi echo_server.c
- gcc echo_server.c -o echo_server
- ./echo_server 50000
아래는 echo_server.c에 입력할 souce code이다.
#include<sys/wait.h>
#include<signal.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#define BUF_LEN 128
void clean();
int main(int argc, char* argv[]) {
struct sockaddr_in server_addr, client_addr;
int master_skt, slave_skt;
int len, len_out;
int port;
char buf[BUF_LEN+1];
if(argc != 3){
printf("사용법 : %s port\n", argv[0]);
return -1;
}
port = atoi(argv[2]);
if(master_skt = socket(PF_INET, SOCK_STREAM, 0) < 0){
printf("서버 소켓 생성 실패\n");
return -1;
}
bzero((char *)&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(port);
if(bind(master_skt, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0){
printf("서버 주소 연결 실패\n");
return -1;
}
listen(master_skt, 5);
signal(SIGCHLD, clean);
while(1) {
printf("Server : Waiting to accept request.\n");
len = sizeof(client_addr);
if(slave_skt = accept(master_skt, (struct sockaddr *)&client_addr, &len) < 0){
printf("Fail to accept the server\n");
return -1;
}
printf("Server : Client connected.\n");
switch(fork()) {
case 0 :
close(master_skt);
len_out = read(slave_skt, buf, sizeof(buf));
write(slave_skt, buf, len_out);
exit();
case -1 :
exit();
default :
close(slave_skt);
}
}
}
void clean(){
union wait status;
while(wait3(&status, WNOHANG, (struct rusage *)0) >= 0){ }
}
'공부 해 Boa요. > Network' 카테고리의 다른 글
Client (0) | 2006.10.15 |
---|---|
Raw Socket (0) | 2006.09.29 |
Consol Echo Client (0) | 2006.09.27 |
실전 네트웍 프로그래밍 - 4 - IOCP Echo Server (0) | 2005.06.29 |
'실전 네트웍 프로그래밍 -3 (0) | 2005.06.29 |