가우디 자유게시판, poll을 이용한 입출력 다중화 > Gaudi Board

본문 바로가기

사이트 내 전체검색

뒤로가기 Gaudi Board

가우디 자유게시판, poll을 이용한 입출력 다중화

페이지 정보

작성자 가우디 이오이오 작성일 20-05-09 22:40 조회 1,079 댓글 0

본문

poll을 이용한 입출력 다중화
-->설명과 예문이 잘 설명되어 있다.
출처: https://www.joinc.co.kr/w/Site/Network_Programing/Documents/Poll

예제 : zipcode_poll.c

#include <sys/time.h> 
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/poll.h>


// 받아들일수 있는 클라이언트의 크기
#define OPEN_MAX 600

int main(int argc, char **argv)
{

int server_sockfd, client_sockfd, sockfd;

int i, maxi;
int nread;
int state = 0;

socklen_t clilen;

struct sockaddr_in clientaddr, serveraddr;

char buf[255];
char line[255];

FILE *fp;

struct pollfd client[OPEN_MAX];

if (argc != 2)
{
printf("Usage : ./zipcode_poll [port]\n");
printf("예 : ./zipcode_poll 4444\n");
exit(0);
}

if ((fp = fopen("zipcode.txt", "r")) == NULL)
{
perror("file open error : ");
exit(0);
}

if ((server_sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
perror("socket error : ");
exit(0);
}
bzero(&serveraddr, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
serveraddr.sin_port = htons(atoi(argv[1]));

state = bind(server_sockfd, (struct sockaddr *)&serveraddr,
sizeof(serveraddr));

if (state == -1)
{
perror("bind error : ");
exit(0);
}
state = listen(server_sockfd, 5);
if (state == -1)
{
perror("listen error : ");
exit(0);
}

// pollfd 구조체에
// 소켓지시자를 할당한다.
// 소켓에 쓰기 events (POLLIN)에 대해서
// 반응하도록 세팅한다.
client[0].fd = server_sockfd;
client[0].events = POLLIN;

// pollfd 구조체의 모든 fd 를 -1 로 초기화 한다.
// fd 가 -1 이면 파일지시자가 세팅되어있지 않다는 뜻이다.
for (i = 1; i < OPEN_MAX; i++)
{
client[i].fd = -1;
}
maxi = 0;

// POLLING 시작
for (;;)
{
nread = poll(client, maxi + i, 1000);

// 만약 POLLIN 이벤트에 대해서
// 되돌려준 이벤트가(revents) POLLIN
// 이라면 accept 한다.
if (client[0].revents & POLLIN)
{
clilen=sizeof(clientaddr);
client_sockfd = accept(server_sockfd,
(struct sockaddr *)&clientaddr,
&clilen);
for (i = 1; i < OPEN_MAX; i++)
{
if (client[i].fd < 0) { client[i].fd = client_sockfd; break; } } if (i == OPEN_MAX) { perror("too many clients : "); exit(0); } client[i].events = POLLIN; if (i > maxi)
{
maxi = i;
}

if (--nread <= 0)
continue;
}

// 현재 파일지시자의 총갯수 만큼 루프를 돌면서
// 각 파일지시자에 POLLIN revent 가 발생했는지를 조사하고
// POLLIN이 발생했다면, 해당 파일지시자에서 데이타를 읽어들이고,
// 주소정보를 돌려준다.
// 만약 "quit" 를 읽었다면, 소켓연결을 끊는다.
for (i = 1; i <= maxi; i++)
{
if ((sockfd = client[i].fd) < 0)
continue;
if (client[i].revents & (POLLIN | POLLERR))
{
rewind(fp);
memset(buf, 0x00, 255);
if (read(sockfd, buf, 255) <= 0)
{
close(client[i].fd);
client[i].fd = -1;
}
else
{
if (strncmp(buf, "quit", 4) == 0)
{
write(sockfd, "byebye\n", 7);
close(client[i].fd);
client[i].fd = -1;
break;
}
while(fgets(line, 255, fp) != NULL)
{
if (strstr(line, buf) != NULL)
write(sockfd, line, 255);
memset(line, 0x00, 255);
}
}
}
}
}
}


블로그 리치 poll 의 포스트입니다.

출처: 블로그 리치 poll 의 포스트의 내용: 바로가기
원문: 기가퍼니닷컴의 블로그 리치 (제목: poll을 이용한 입출력 다중화): 내용 더보기
게시일: 2017-06-02|3:00 오후, 수정일: 2017-06-02|3:00 pm


--- 아래는 블로그 포스트 내용들입니다. 위의 바로가기를 클릭하면 아래 내용을 볼 수 있습니다.
★★ 석사 1주일, 박사 1개월 논문 완성 가능: 게시일-2015-03-02:
★★ 통계박사의 인터넷 논문 설문조사 안내: 게시일-2014-05-01:
★★ ahp 분석의 비밀 - RI ( Random Index ): 게시일-2013-09-22:
★★ 통계박사 위치 안내: 게시일-2013-09-06:
★★ 2013년 8월 9일 오전 10시 54분에 저장한 글입니다.: 게시일-2013-08-09:
★★ 2013년 8월 9일 오전 10시 51분에 저장한 글입니다.: 게시일-2013-08-09:
★★ 논문 준비 학생을 위한 연구계획서, 설문지 작성 및 통계 분석 방향 교육: 게시일-2013-06-14:
★★ 통계박사 지식기부활동 - 논문 설문이 가설을 잘 반영하도록 만들어졌는지 무료자문해드립니다.: 게시일-2012-01-28:
★★ 통계박사 안내 QR코드: 게시일-2011-02-14:
★★ 통계박사에 오신 것을 환영합니다.: 게시일-2007-06-24:
---
추천1

댓글목록 0

등록된 댓글이 없습니다.

Copyright © gaudi2525.com. All rights reserved.
PC Version