- Today
- Total
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Link
- 재능이의 돈버는 일기
- StresslessLife
- K_JIN2SM
- 소소한 일상
- My Life Style & Memory a Box
- Blog's generation
- 공감 스토리
- 취객의 프로그래밍 연구실
- Love Me
- Dream Archive
- 세상에 발자취를 남기다 by kongmingu
- hanglesoul
- 카마의 IT 초행길
- 느리게.
- 미친듯이 즐겨보자..
- Joo studio
- Gonna be insane
- 악 다 날아갔어!! 갇대밋! 왓더...
- xopowo05
- 맑은공기희망운동
- 엔지니어 독립운동
- 혁준 블로그
- Simple in Complex with Simple
- 무의식이 의식을 지배한다
드럼치는 프로그래머
[TCP/IP] Echo (에코) 프로그램 Server (리눅스) 본문
Echo (에코) 프로그램 Server (리눅스)
/* 헤더파일 선언 */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#define BUFSIZE 1024 // 메시지를 저장할 크기를 정의
void error_handling(char *message); // error_handling 함수 프로토타입 선언.
/* main 함수 */
int main(int argc, char **argv) // port정보를 인자로 받음.
{
int serv_sock; // server 디스크립터를 저장할 변수선언.
int clnt_sock; // client 디스크립터를 저장할 변수선언.
char message[BUFSIZE]; // 메시지를 저장할 배열선언.
int str_len; // 수신받은 데이터의 크기를 저장할 변수선언.
struct sockaddr_in serv_addr; // server의 주소정보를 저장할 구조체변수선언.
struct sockaddr_in clnt_addr; // client의 주소정보를 저장할 구조체변수선언.
unsigned int clnt_addr_size; // client 정보 구조체의 크기를 저장할 변수선언.
if(argc != 2) { // port정보가 올바르지 않다면if문 실행.
printf("Usage : %s <port> \n", argv[0]); // error정보 출력.
exit(1); // 프로그램 강제종료.
}
serv_sock = socket(PF_INET, SOCK_STREAM, 0); // 소켓 생성.
if(serv_sock == -1) // 소켓 생성 실패시 if문 실행.
error_handling("socket() error"); // error_handling 함수 실행
memset(&serv_addr, 0, sizeof(serv_addr)); // 인자로 전달된 구조체 변수를 0으로 초기화.
serv_addr.sin_family = AF_INET; // 프로토콜 체계 설정.
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); // 네트워크 바이트 순서 -> 32비트 ip값으로 변환.
serv_addr.sin_port = htons(atoi(argv[1])); // port정보를 네트워크 바이트 순서로 변환.
if( bind(serv_sock, (struct sockaddr*) &serv_addr, // 소켓에 주소 할당.
sizeof(serv_addr)) == -1) error_handling("bind() error"); // error_handling 함수 실행.
if(listen(serv_sock, 5) == -1) // 연결 요청 대기 상태로 진입.
error_handling("listen() error"); // 실패시 error_handling 함수 실행.
clnt_addr_size = sizeof(clnt_addr); // client 주소 정보 구조체의 크기를 저장.
clnt_sock = accept(serv_sock, (struct sockaddr*) &clnt_addr,
&clnt_addr_size); // 연결 요청 수락.
if(clnt_sock == -1) // 연결 요청 실패시 if문 실행.
error_handling("accept() error"); // error_handling 함수 실행.
/* 데이터 수신 및 전송 */
while((str_len = read(clnt_sock, message, BUFSIZE)) != 0 ) // 메시지를 수신받고 길이 저장.
{ // EOF를 만나면 반복문 탈출.
write(clnt_sock, message, str_len); // 수신한 메시지의 크기만큼 데이터 전송.
write(1, message, str_len); // 메시지를 server에 출력 ( 표준 출력 )
}
close(clnt_sock); // 클라이언트 소켓 종료.
return 0; // 프로그램 정상종료.
}
/* error_handling 함수 */
void error_handling(char *message) // 오류메시지를 매개변수로 전달받아 실행.
{
fputs(message, stderr); // 오류메시지를 출력.
fputc('\n', stderr);
exit(1); // 프로그램 강제종료.
}
/* 헤더파일 선언 */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#define BUFSIZE 1024 // 메시지를 저장할 크기를 정의
void error_handling(char *message); // error_handling 함수 프로토타입 선언.
/* main 함수 */
int main(int argc, char **argv) // port정보를 인자로 받음.
{
int serv_sock; // server 디스크립터를 저장할 변수선언.
int clnt_sock; // client 디스크립터를 저장할 변수선언.
char message[BUFSIZE]; // 메시지를 저장할 배열선언.
int str_len; // 수신받은 데이터의 크기를 저장할 변수선언.
struct sockaddr_in serv_addr; // server의 주소정보를 저장할 구조체변수선언.
struct sockaddr_in clnt_addr; // client의 주소정보를 저장할 구조체변수선언.
unsigned int clnt_addr_size; // client 정보 구조체의 크기를 저장할 변수선언.
if(argc != 2) { // port정보가 올바르지 않다면if문 실행.
printf("Usage : %s <port> \n", argv[0]); // error정보 출력.
exit(1); // 프로그램 강제종료.
}
serv_sock = socket(PF_INET, SOCK_STREAM, 0); // 소켓 생성.
if(serv_sock == -1) // 소켓 생성 실패시 if문 실행.
error_handling("socket() error"); // error_handling 함수 실행
memset(&serv_addr, 0, sizeof(serv_addr)); // 인자로 전달된 구조체 변수를 0으로 초기화.
serv_addr.sin_family = AF_INET; // 프로토콜 체계 설정.
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); // 네트워크 바이트 순서 -> 32비트 ip값으로 변환.
serv_addr.sin_port = htons(atoi(argv[1])); // port정보를 네트워크 바이트 순서로 변환.
if( bind(serv_sock, (struct sockaddr*) &serv_addr, // 소켓에 주소 할당.
sizeof(serv_addr)) == -1) error_handling("bind() error"); // error_handling 함수 실행.
if(listen(serv_sock, 5) == -1) // 연결 요청 대기 상태로 진입.
error_handling("listen() error"); // 실패시 error_handling 함수 실행.
clnt_addr_size = sizeof(clnt_addr); // client 주소 정보 구조체의 크기를 저장.
clnt_sock = accept(serv_sock, (struct sockaddr*) &clnt_addr,
&clnt_addr_size); // 연결 요청 수락.
if(clnt_sock == -1) // 연결 요청 실패시 if문 실행.
error_handling("accept() error"); // error_handling 함수 실행.
/* 데이터 수신 및 전송 */
while((str_len = read(clnt_sock, message, BUFSIZE)) != 0 ) // 메시지를 수신받고 길이 저장.
{ // EOF를 만나면 반복문 탈출.
write(clnt_sock, message, str_len); // 수신한 메시지의 크기만큼 데이터 전송.
write(1, message, str_len); // 메시지를 server에 출력 ( 표준 출력 )
}
close(clnt_sock); // 클라이언트 소켓 종료.
return 0; // 프로그램 정상종료.
}
/* error_handling 함수 */
void error_handling(char *message) // 오류메시지를 매개변수로 전달받아 실행.
{
fputs(message, stderr); // 오류메시지를 출력.
fputc('\n', stderr);
exit(1); // 프로그램 강제종료.
}
'★─Programing > ☆─TCP IP' 카테고리의 다른 글
[TCP/IP] 리눅스 소켓프로그래밍 기본적인 함수 (0) | 2009.01.19 |
---|---|
[TCP/IP] Echo (에코) 프로그램 Client (리눅스) (0) | 2008.12.13 |
[TCP/IP] PF_INET과 AF_INET 비교 (1) | 2008.12.12 |
[TCP/IP] CreateThread 후에 바로 CloseHandle하는 이유 (0) | 2008.05.09 |
[TCP/IP] CreateThread() (0) | 2008.05.09 |
Comments