Humaneer.net
Home
Tag
MediaLog
LocationLog
Guestbook
Admin
Write
search
Total |
77,742
Today |
17
Yesterday |
26
'Echo server'에 해당되는 글 1건
2008/03/25
Echo Server & Client (using pthread)
Engineering/C/C++
2008/03/25 15:06
Echo Server & Client (using pthread)
/* Echo Server */ #include <stdio.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/types.h> #include <sys/socket.h> #include <pthread.h> #define BUFSIZE 1024 #define MAXCLIENT 10 /* accept()한 클라이언트를 처리할 쓰레드 함수 */ void* clientHandler(void* arg); /* main() 시작 */ int main(int argc, char* argv[]) { /* 서버와 클라이언트의 소켓을 할당할 변수 */ int serv_sock; int clnt_sock; /* 서버와 클라이언트의 주소정보를 할당할 변수 */ struct sockaddr_in serv_addr; struct sockaddr_in clnt_addr; int clnt_addr_size = sizeof(clnt_addr); /* 쓰레드 id를 저장할 변수*/ pthread_t t_id; /* 사용법 설명 */ if (argc != 2) { fprintf(stderr, "Usage : %s <port>\n", argv[0]); return 0; } /* 소켓 할당 받기 */ if ((serv_sock = socket(PF_INET, SOCK_STREAM, 0)) == -1) { perror("socket() error"); return -1; } /* 구조체 초기화 */ 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) { perror("bind() error"); return -1; } /* 클라이언트 10개까지 접속을 기다림 */ if (listen(serv_sock, MAXCLIENT) == -1) { perror("listen() error"); return -1; } fprintf(stderr,"Waiting for Clients...\n"); /* 무한루프를 돌면서 클라이언트의 접속을 처리함 */ while(1) { /* 클라이언트의 접속을 accept함 */ if ((clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_addr, &clnt_addr_size)) == -1) { perror("accept() error"); return -1; } /* 쓰레드를 하나 생성하여 클라이언트의 소켓을 넘겨줌 */ if (pthread_create(&t_id, NULL, clientHandler, (void*)&clnt_sock) < 0) { perror("pthread_create() error"); return -1; } } close(serv_sock); return 0; } /* accept()한 클라이언트를 처리하는 쓰레드함수 */ void* clientHandler(void* arg) { fprintf(stderr,"A client has been connected\n"); /* 쓰레드를 메인 쓰레드로부터 떼어냄 */ pthread_detach(pthread_self()); /* 메세지를 저장할 버퍼와, 클라이언트의 소켓 번호 */ char buf[BUFSIZE]; int clnt_sock = *((int*)arg); // 형변환 int n_read; /* 클라이언트로부터 메세지를 읽어옴 */ while((n_read = read(clnt_sock, buf, BUFSIZE - 1)) > 0) { write(STDOUT_FILENO, buf, n_read); /* 받은 메세지를 그대로 다시 클라이언트에게 전송 */ if (write(clnt_sock, buf, n_read) < 0) { perror("write() error"); exit(1); } } /* 소켓 닫고, 쓰레드 종료 */ close(clnt_sock); return (void*)NULL; }
/* Echo Client */ #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 1024 /* main() 시작 */ int main(int argc, char* argv[]) { /* 소켓번호, 메세지 길이를 처리할 변수 */ int sock; int str_len, recv_len, recv_num; /* 메세지 버퍼와 서버주소정보를 저장할 변수*/ char message[BUFSIZE]; struct sockaddr_in serv_addr; /* 사용법 설명 */ if (argc != 3) { fprintf(stderr, "Usage : %s <ip> <port>\n", argv[0]); return 0; } /* 소켓 할당받기 */ if ((sock = socket(PF_INET, SOCK_STREAM, 0)) < 0) { perror("socket() error"); return -1; } /* 서버주소 정보를 담은 구조체 초기화 */ 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)) < 0) { perror("connect() error"); return -1; } fprintf(stderr, "Connected to server(%s : %s)\n", argv[1], argv[2]); /* "q"를 입력받을 때 까지 무한루프를 돌며 서버에 메세지를 보냄 */ while(1) { fprintf(stderr, "Message to Server (q to quit) : "); str_len = read(STDIN_FILENO, message, BUFSIZE - 1); message[str_len] = 0; /* "q" 이면 클라이언트 종료 */ if (!strcmp(message, "q\n")) break; /* 서버에 메세지 전송 */ write(sock, message, str_len); /* 전송했던 메세지를 정확하게 다 받을 때 까지 계속 서버로부터 메세지를 읽어옴 */ for(recv_len = 0; recv_len < str_len ; ) { if ((recv_num = read(sock, message + recv_len, str_len - recv_len)) == -1) perror("read() error"); recv_len += recv_num; } message[str_len] = 0; /* 되돌려 받은 메세지 출력 */ fprintf(stderr, "Message from Server : %s\n", message); } /* 소켓닫고 프로그램 종료 */ close(sock); return 0; }
Posted by
비회원
TAG
C/C++
,
Echo server
,
Linux/Unix
,
POSIX
,
PR
,
pthread
,
socket
,
Socket Programming
,
TCP/IP
Trackback
0
Comment
0
TRACKBACK
http://humaneer.net/trackback/141
«이전
1
다음»
Humaneer
Engineer with Humanism
카테고리
분류 전체보기
(246)
Human Life
(158)
Daily Note
(55)
Love
(19)
Prejudice
(26)
Movie
(17)
Poetry
(19)
Book
(6)
Music
(3)
Finalcial Tech
(0)
Sundries
(13)
Play & Musical
(0)
Engineering
(66)
Tip & Tech
(15)
C/C++
(24)
System
(2)
Network
(6)
Algorithm
(3)
Embedded
(1)
JAVA
(4)
Android
(4)
Pattern Recognition
(1)
Etc
(6)
English
(13)
Radar
(5)
Matlab & Simulink
(1)
공지사항
Humaneer.net 연결되었습니다.
블로그 이사왔습니다.
네티켓을 지킵시다.
태그목록
패턴인식
구조체
갯벌
pattern recognition
mfc
제부도 맛집
ethtool
ethtool로 이더넷 포트확인하기
제부도
android move
debug console
네트워크 프로그래밍
Android
반성
스마트폰
blank struct
emulator.exe
안드로이드
갯벌체험
twitter
바지락잡이
패턴인식의 정의
조개잡이
Socket Programming
빈 구조체
android AVD
AVD
트위터
제부도 여행
C/C++
최근에 올라온 글
C++에서의 빈 구조체...
(1)
패턴인식의 정의(Def...
안드로이드(Android)...
(리눅스 팁)ethtool...
스마트폰을 써보며...
(2)
최근에 달린 댓글
C++에서는 Stru...
Humaneer
2011
음.. 제가 오래...
Humaneer
2011
코드부분이 잘...
Kluster86
2011
니 위키에는 방...
Humaneer
2010
음.거의 1년 전...
Humaneer
2010
최근에 받은 트랙백
[영화,멜로] 감...
월풍도원(月風..
2010
세월이 가면 -...
미로속의 루나
2008
당신들 눈물겹...
연습장
2007
링크
마눌님's Blog.
홍's Blog.
성호's Blog.
승윤's Blog.
문규's Homepage.
Umentia.com.
Didimdol.
성일's Blog.
신국's Blog.
은한's Blog.
인태's Blog.
티스토리 홈
티스토리 가입하기