티스토리 뷰
IT 이야기/프로그래밍
다중 프로세스 기반의 동시 처리 에코 서버/클라이언트 (echo_multi_server.c/echo_multi_client.c)
하늘과 나b 2010. 4. 27. 05:55/* echo_multi_server.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/socket.h>
#define BUFSIZE 30
void error_handling(char *message);
void z_handler(int sig);
int main(int argc, char **argv)
{
int serv_sock; // server socket descriptor
int conn_sock; // server connection socket descriptor
struct sockaddr_in serv_addr;
struct sockaddr_in conn_addr;
struct sigaction act;
int addr_size, str_len, state;
pid_t pid;
char message[BUFSIZE];
if(argc!=2){
printf("Usage : %s <port>\n", argv[0]);
exit(1);
}
act.sa_handler=z_handler;
sigemptyset(&act.sa_mask);
act.sa_flags=0;
/* 시그널 핸들러 등록 */
state=sigaction(SIGCHLD, &act, 0);
if(state != 0){
puts("sigaction() error");
exit(1);
}
serv_sock=socket(PF_INET, SOCK_STREAM, 0);
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(atoi(argv[1]));
if( bind(serv_sock, (struct sockaddr*) &serv_addr, sizeof(serv_addr)) == -1 )
error_handling("bind() error");
if( listen(serv_sock, 5) == -1 )
error_handling("listen() error");
while(1)
{
addr_size = sizeof(conn_addr);
conn_sock = accept(serv_sock, (struct sockaddr*)&conn_addr, &addr_size);
if( conn_sock == -1 )
continue;
/* 클라이언트와의 연결을 독립적으로 생성 */
/* fork 실패 시 */
/* 부모 프로세스인 경우 */
/* '연결 생성' 문자열 출력 */
/* 연결소켓(conn_sock) 종료 */
/* 자식 프로세스의 경우 */
/* 듣기소켓(serv_sock) 종료 */
if( (pid=fork()) ==-1) { /* fork 실패 시 */
close(conn_sock);
continue;
}
else if( pid>0 ) { /* 부모 프로세스인 경우 */
puts("연결 생성");
close(conn_sock);
continue;
}
else { /* 자식 프로세스의 경우 */
close(serv_sock);
/* 자식 프로세스의 처리영역 : 데이터 수신 및 전송 */
/* 1. 클라이언트로부터 수신한 데이터를 읽어들인다. */
/* 2. 수신한 데이터를 다시 클라이언트로 송신한다. */
/* 3. 수신한 데이터를 출력한다. */
/* 4. 1~3과정을 반복한다. */
while( (str_len=read(conn_sock, message, BUFSIZE)) != 0) {
write(conn_sock, message, str_len);
write(1, message, str_len);
}
puts("연결 종료");
close(conn_sock);
exit(0);
}
}
return 0;
}
void z_handler(int sig)
{
pid_t pid;
int rtn;
pid=waitpid(-1, &rtn, WNOHANG);
printf("소멸된 좀비의 프로세스 ID : %d \n", pid);
printf("리턴된 데이터 : %d \n\n", WEXITSTATUS(rtn));
}
void error_handling(char *message)
{
fputs(message, stderr);
fputc('\n', stderr);
exit(1);
}
/* echo_multi_client.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#define BUFSIZE 30
void error_handling(char *message);
int main(int argc, char **argv)
{
int sock;
pid_t pid;
char message[BUFSIZE];
int str_len, recv_len, recv_num;
struct sockaddr_in serv_addr;
if(argc!=3){
printf("Usage : %s <IP> <port>\n", argv[0]);
exit(1);
}
sock=socket(PF_INET, SOCK_STREAM, 0);
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr(argv[1]);
serv_addr.sin_port = htons(atoi(argv[2]));
if(connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr))==-1)
error_handling("connect() error!");
pid = fork();
if(pid==0)
{
while(1)
{
fputs("전송할 메세지를 입력 하세요 (q to quit) : ", stdout);
fgets(message, BUFSIZE, stdin);
if(!strcmp(message,"q\n"))
{
shutdown(sock, SHUT_WR);
close(sock);
exit(0);
}
write(sock, message, strlen(message));
} /* while(1) end */
} /* if(pid==0) end */
else
{
while(1)
{
int str_len = read(sock, message, BUFSIZE);
if(str_len == 0){
exit(0);
}
message[str_len]=0;
printf("서버로부터 전송된 메시지 : %s\n", message);
} /* while(1) end */
} /* else end*/
close(sock);
return 0;
}
void error_handling(char *message)
{
fputs(message, stderr);
fputc('\n', stderr);
exit(1);
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/socket.h>
#define BUFSIZE 30
void error_handling(char *message);
void z_handler(int sig);
int main(int argc, char **argv)
{
int serv_sock; // server socket descriptor
int conn_sock; // server connection socket descriptor
struct sockaddr_in serv_addr;
struct sockaddr_in conn_addr;
struct sigaction act;
int addr_size, str_len, state;
pid_t pid;
char message[BUFSIZE];
if(argc!=2){
printf("Usage : %s <port>\n", argv[0]);
exit(1);
}
act.sa_handler=z_handler;
sigemptyset(&act.sa_mask);
act.sa_flags=0;
/* 시그널 핸들러 등록 */
state=sigaction(SIGCHLD, &act, 0);
if(state != 0){
puts("sigaction() error");
exit(1);
}
serv_sock=socket(PF_INET, SOCK_STREAM, 0);
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(atoi(argv[1]));
if( bind(serv_sock, (struct sockaddr*) &serv_addr, sizeof(serv_addr)) == -1 )
error_handling("bind() error");
if( listen(serv_sock, 5) == -1 )
error_handling("listen() error");
while(1)
{
addr_size = sizeof(conn_addr);
conn_sock = accept(serv_sock, (struct sockaddr*)&conn_addr, &addr_size);
if( conn_sock == -1 )
continue;
/* 클라이언트와의 연결을 독립적으로 생성 */
/* fork 실패 시 */
/* 부모 프로세스인 경우 */
/* '연결 생성' 문자열 출력 */
/* 연결소켓(conn_sock) 종료 */
/* 자식 프로세스의 경우 */
/* 듣기소켓(serv_sock) 종료 */
if( (pid=fork()) ==-1) { /* fork 실패 시 */
close(conn_sock);
continue;
}
else if( pid>0 ) { /* 부모 프로세스인 경우 */
puts("연결 생성");
close(conn_sock);
continue;
}
else { /* 자식 프로세스의 경우 */
close(serv_sock);
/* 자식 프로세스의 처리영역 : 데이터 수신 및 전송 */
/* 1. 클라이언트로부터 수신한 데이터를 읽어들인다. */
/* 2. 수신한 데이터를 다시 클라이언트로 송신한다. */
/* 3. 수신한 데이터를 출력한다. */
/* 4. 1~3과정을 반복한다. */
while( (str_len=read(conn_sock, message, BUFSIZE)) != 0) {
write(conn_sock, message, str_len);
write(1, message, str_len);
}
puts("연결 종료");
close(conn_sock);
exit(0);
}
}
return 0;
}
void z_handler(int sig)
{
pid_t pid;
int rtn;
pid=waitpid(-1, &rtn, WNOHANG);
printf("소멸된 좀비의 프로세스 ID : %d \n", pid);
printf("리턴된 데이터 : %d \n\n", WEXITSTATUS(rtn));
}
void error_handling(char *message)
{
fputs(message, stderr);
fputc('\n', stderr);
exit(1);
}
/* echo_multi_client.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#define BUFSIZE 30
void error_handling(char *message);
int main(int argc, char **argv)
{
int sock;
pid_t pid;
char message[BUFSIZE];
int str_len, recv_len, recv_num;
struct sockaddr_in serv_addr;
if(argc!=3){
printf("Usage : %s <IP> <port>\n", argv[0]);
exit(1);
}
sock=socket(PF_INET, SOCK_STREAM, 0);
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr(argv[1]);
serv_addr.sin_port = htons(atoi(argv[2]));
if(connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr))==-1)
error_handling("connect() error!");
pid = fork();
if(pid==0)
{
while(1)
{
fputs("전송할 메세지를 입력 하세요 (q to quit) : ", stdout);
fgets(message, BUFSIZE, stdin);
if(!strcmp(message,"q\n"))
{
shutdown(sock, SHUT_WR);
close(sock);
exit(0);
}
write(sock, message, strlen(message));
} /* while(1) end */
} /* if(pid==0) end */
else
{
while(1)
{
int str_len = read(sock, message, BUFSIZE);
if(str_len == 0){
exit(0);
}
message[str_len]=0;
printf("서버로부터 전송된 메시지 : %s\n", message);
} /* while(1) end */
} /* else end*/
close(sock);
return 0;
}
void error_handling(char *message)
{
fputs(message, stderr);
fputc('\n', stderr);
exit(1);
}
'IT 이야기 > 프로그래밍' 카테고리의 다른 글
[Javascript] Window open() 함수 (0) | 2010.04.29 |
---|---|
getbyhostaddr() 함수 예제 소스 (0) | 2010.04.27 |
fork test 소스2 (0) | 2010.04.27 |
strcmp(), stricmp(), strncmp(), strnicmp() (0) | 2010.04.27 |
fork test 소스1 (0) | 2010.04.27 |
[문자열 함수] strcat(), strncat() 함수 (0) | 2010.04.26 |
getsockopt()를 이용한 버퍼 크기 확인 예제 프로그램 (0) | 2010.04.26 |
hello_world server & client 소스 (0) | 2010.04.26 |
gethostbyname() 예제 (0) | 2010.04.26 |
파일/소켓 디스크립터(file/socket descriptor) 생성 예제 (0) | 2010.04.26 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
- W3Schools Online Web Tutorials
- 구차니의 잡동사니 모음
- [IT]블로거팁닷컴
- 비앤아이님의 블로그
- Blog Suspect
- 즐거운하루 blog
- zinicap의 검색엔진 마케팅(SEM)
- 머니야머니야님의 블로그
- [Friend] AtinStory
- [기타배우기]해브원 박스
- [웹표준] SINDB.com
- 해커 C 이야기
- [애드센스] 길라잡이
- 정순봉의 IT SCHOOL
- 씨디맨의 컴퓨터이야기
- 2proo Life Story
- 못된준코의 세상리뷰
- [IT강좌] 정보문화사
- IN 대전
- 에우르트는 나쁜남자 -_-
- 씬의 싱크탱크
- 엔돌슨의 IT이야기
- 진이늘이
- 'Cooltime'의 블로그
- 후이의 Tistory
- Soulstorage
- 앤드&엔드의 블로그
- June Blog
- 노지의 소박한 이야기
- gbWorld
- 인터넷 속 나의 생각
- HarshNix
- ART of WEB
- 녹두장군 - 상상을 현실로
TAG
- 강좌
- php
- C언어 문제
- 소스코드
- 프로그래밍 문제
- 리뷰
- MBTI 강좌
- HTML
- 성공
- C
- 모토로이
- JavaScript
- 스마트폰
- 안드로이드
- 강의
- MBTI 테스트
- MBTI 자료
- 인터넷 익스플로러
- 프로그래밍
- 안드로이드 어플 추천
- C언어 소스
- MBTI
- MBTI 검사
- C언어
- 소스
- 효과음
- 안드로이드 어플
- 예제 소스
- It
- 인터넷
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함