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

References