time-wait
nagle 알고리즘
다중접속 서버
fork 함수 - 프로세스를 복제한다
좀비 프로세스 - 프로세스 종료 후 메모리상에서 사라지지 않는 프로세스
시그널 핸들링
프로세스 기반의 다중접속 서버구현
2014년 3월 25일 화요일
2014년 3월 20일 목요일
소켓 프로그램 소스 샘플(서버, 클라이언트)
다음은 간단한 소켓 프로그램 서버와 클라이언트의 소스이다
해보니 그냥 일반 jsp와 다를바 없어 보인다
client source
다 하고 나서 컴파일은
gcc serverHello.c -o server
gcc client.c -o client
이렇게 하고 서버 먼저 실행하고 클라이언트에서 접속해보면 된다
출처 : tcp/ip 소켓 프로그래밍 책에서...
해보니 그냥 일반 jsp와 다를바 없어 보인다
- server source
/* * helloworld_server.c * Written by SW. YOON */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/types.h> #include <sys/socket.h> void error_handling(char *message); 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; char message[]="Hello World!\n"; if(argc!=2){ printf("Usage : %s <port>\n", argv[0]); exit(1); } serv_sock=socket(PF_INET, SOCK_STREAM, 0); /* 서버 소켓 생성 */ if(serv_sock == -1) error_handling("socket() error"); 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"); for(;;){ clnt_addr_size=sizeof(clnt_addr); clnt_sock=accept(serv_sock, (struct sockaddr*)&clnt_addr,&clnt_addr_size); /* 연결 요청 수락 */ if(clnt_sock==-1) error_handling("accept() error"); write(clnt_sock, message, sizeof(message)); /* 데이터 전송 */ printf("Message in server : %s \n", message); close(clnt_sock); /* 연결 종료 */ } return 0; } void error_handling(char *message) { fputs(message, stderr); fputc('\n', stderr); exit(1); }
client source
/* * helloworld_client.c * Written by SW. YOON */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/types.h> #include <sys/socket.h> void error_handling(char *message); int main(int argc, char **argv) { int sock; struct sockaddr_in serv_addr; char message[30]; int str_len; if(argc!=3){ printf("Usage : %s <IP> <port>\n", argv[0]); exit(1); } sock=socket(PF_INET, SOCK_STREAM, 0); /* 서버 접속을 위한 클라이언트 소켓 생성 */ if(sock == -1) error_handling("socket() error"); 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!"); str_len=read(sock, message, sizeof(message)-1); /* 데이터 수신 */ if(str_len==-1) error_handling("read() error!"); message[str_len]=0; printf("Message from server : %s \n", message); close(sock); /* 연결 종료 */ return 0; } void error_handling(char *message) { fputs(message, stderr); fputc('\n', stderr); exit(1); }
다 하고 나서 컴파일은
gcc serverHello.c -o server
gcc client.c -o client
이렇게 하고 서버 먼저 실행하고 클라이언트에서 접속해보면 된다
출처 : tcp/ip 소켓 프로그래밍 책에서...
2014년 3월 19일 수요일
네트워크 프로그램
네트워크가 모여서 인터넷이 된다
네트워크와 네트워크를 연결해주는 것이 라우터
서버오와 클라이언트는 프로그램이지 머신이 아닌다
네트워크프로그래밍이랑 소켓이란 의미랑 일반적으로 같이 쓴다
소켓은 장치임
low-level - 운영체제가 제공해주는
리눅스에서는 모든것을 다 파일로 관리
- 파일을 생성하던, 소켓을 생성하던 관리하는것은 리눅스이고, 둘 다 파일로 간주 한다.
그래서 파일 입출력 함수인 read나 write를 소켓에서도 고대로 갔다 쓸 수 있다
데이터 전송하는 것은 출력이고, 입력 받는것은 수신, 즉 전송=출력이고 수신이 입력이다
tcp/ip 프로토콜 스택 -> 프로토콜을 쌓아놓은 것
divide and conqure
소켓, 파일 디스크립터, 프로토콜
피드 구독하기:
글 (Atom)
image