- 멀티 플렉싱 서버의 구현
- 지금 까지 익혀온 select 함수의 사용법을 바탕으로 멀티 플렉싱 서버를 구현할 차례이다.
- 다음예제는 멀티플렉싱 기반의 에코 서버이다.
- echo_selectserv.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <sys/select.h>
#define BUF_SIZE 100
void error_handling(const char *buf);
int main(int argc, char *argv[])
{
int serv_sock, clnt_sock;
struct sockaddr_in serv_adr, clnt_adr;
struct timeval timeout;
fd_set reads, cpy_reads;
socklen_t adr_sz;
int fd_max, str_len, fd_num , i;
char buf[BUF_SIZE];
if(argc != 2)
{
printf("USage : %s <port>\n", argv[0]);
exit(1);
}
serv_sock = socket(PF_INET, SOCK_STREAM, 0);
memset(&serv_adr, 0, sizeof(serv_adr));
serv_adr.sin_family = AF_INET;
serv_adr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_adr.sin_port = htons(atoi(argv[1]));
if(bind(serv_sock, (struct sockaddr*)&serv_Adr, sizeof(serv_Adr)) == -1)
error_handling("bind() error");
if(listen(serv_sock, 5) == -1)
error_handling("listen() error");
FD_ZERO(&reads);
FD_SET(serv_sock, &reads);
fd_max = serv_sock;
while(1)
{
cpy_reads = reads;
timeout.tv_sec = 5;
timeout.tv_usec = 5000;
if( (fd_num = select(fd_max +1, &cpy_reads, 0, 0, &timeout)) == -1)
break;
if(fd_num == 0)
continue;
for(i =0; i< fd_max+1; i++)
{
if(FD_ISSET(i, &cpy_reads))
{
if(i == serv_Sock ) //connection request!
{
adr_sz = sizeof(clnt_adr);
clnt_sock = accept(Serv_Sock, (struct sockaddr*)&clnt_Adr, &adr_sz);
FD_SET(clnt_Sock, &reads);
if(fd_max <clnt_Sock)
fd_max = clnt_sock;
printf("connected Client: %d \n ", clnt_sock);
}
else // read message !
{
str_len = read(i, buf, BUF_SIZE);
if(str_len == 0) // close request!
{
FD_CLR(i, &reads);
close(i);
printf("closed client : %d \n", i);
}
else
{
write(i, buf, str_len); //echo!
}
}
}
}
}
close(serv_sock);
return 0;
}
void error_handling(const char *buf)
{
fputs(buf, stderr);
fputc('\n', stderr);
exit(1);
}
'책 > 윤성우 TCPIP' 카테고리의 다른 글
12-02 select 함수의이해와 서버의 구현 (0) | 2020.12.29 |
---|---|
12-01 : IO 멀티플렉싱 기반의 서버(2) (0) | 2020.12.28 |
12 IO 멀티플렉싱(Multiplexing) (0) | 2020.12.27 |
11-01 프로세스간 통신의 기본 개념 (3) ~ 11-02 프로세스간 통신의 적용 (0) | 2020.12.26 |
11-01 프로세스간 통신의 기본 개념 (2) (0) | 2020.12.25 |