Abstraction
Connection Pooling 을 구현하면서 언제 TCP 커넥션을 맺고 끊는지 궁금했다. 그래서 생성 시점을 알려주는 작은 서버를 만들었다.
http://code.google.com/p/contest-server
서버의 이름은 TCP CONnection TESter 줄여서 CONTEST 이다.
동작 원리
memcached 프로토콜(text-protocol only)을 지원해 null 값을 받아온 것 처럼 동작한다. 무엇보다 커넥션 생성/해제 시점, 전체 커넥션 수를 정확히 알려주어 TCP 테스트에 많은 도움이 되도록 했다.
이 프로젝트는 오픈 소스로 구글 코드를 통해 공개했다. 원하는 사람은 누구나 소스를 열람할 수 있으며 누구나 개선 작업에 참여할 수 있다.
http://code.google.com/p/contest-server/source/browse/trunk/contest.c
CONTEST: A Very Simple TCP CONnection TESTer
by Sang-Kil Park <skpark@daumcorp.com> at Jun 2010
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <pthread.h>
#define BUF_SIZE 255
#define DEFAULT_PORT 11212
#define LISTEN_LIMIT 128
#define RESPONSE_MSG "END\r\n"
void * handle_clnt(void * params);
void error_handling(char * msg);
int clnt_cnt=0;
int clnt_latest=0;
int port = DEFAULT_PORT;
pthread_mutex_t mutx;
typedef struct {
int clnt_id;
int clnt_sock;
} thread_parm_t;
int main(int argc, char *argv[]) {
int serv_sock, clnt_sock;
struct sockaddr_in serv_adr, clnt_adr;
int clnt_adr_sz;
int on=1;
pthread_t t_id;
thread_parm_t *parms=NULL;
if (argc==2) {
if (strcmp(argv[1],"-h") == 0) {
printf("Usage: %s <Port>\n", argv[0]);
exit(1);
}
port = atoi(argv[1]);
}
pthread_mutex_init(&mutx, NULL);
serv_sock=socket(PF_INET, SOCK_STREAM, 0);
… (이하 생략)
서버를 실행하면 TCP 커넥션에 따라 화면에 로그가 출력되며 구조는 아래와 같다.
Connected 일련번호(소켓번호) - 클라이언트IP:클라이언트Port, TC:현재열린커넥션수
# ./contest 11212 Connected 1(#4) - 192.168.64.81:3252, TC:1 Received 1(#4) - get aa Connected 2(#5) - 192.168.64.81:3255, TC:2 Received 2(#5) - get aa Connected 3(#6) - 192.168.64.81:3258, TC:3 Received 3(#6) - get aa Connected 4(#7) - 192.168.64.81:3261, TC:4 Received 4(#7) - get aa Connected 5(#8) - 192.168.64.81:3264, TC:5 Received 5(#8) - get aa


