tcp.h 3.65 KB
/**    
    @file     tcp.c
    @date     2009-03-27
    @author   오재경 freefrug@falinux.com
    @brief    tcp 를 사용한 통신을 담당한다.
              
    @modify   
              2010-08-18 (장길석) mingw와 함께 사용할 수 있는 코드 추가
    @todo    
    @bug     
    @remark   
    
    @warning 
*/
//
//  저작권    에프에이리눅스(주)
//            외부공개 금지
//
//----------------------------------------------------------------------------

#ifndef _TCP_H_
#define _TCP_H_

#define EMBEDDED_LINUX

#ifdef MS_WIN32
    #undef EMBEDDED_LINUX
#endif


//#include <netinet/in.h>

/// tcp 소켓의 형태를 구분한다.
#define  SOCK_TYPE_CLIENT          0
#define  SOCK_TYPE_SERVER          1
#define  SOCK_TYPE_SERVER_CLIENT   2

/// 정책의 대한 옵션
#define  BF_POLICY_CLOSE_IOERR     (1<<0 )        /// read(), write() 함수 에러발생시 접속을 끊는다.
#define  BF_POLICY_CLOSE_TIMEOUT   (1<<1 )        /// SOCK_TYPE_SERVER_CLIENT 타입에 한해서 특정시간이 지난후라면 접속을 끊는다.
#define  BF_POLICY_RELOAD_TIMEOUT  (1<<2 )        /// SOCK_TYPE_SERVER_CLIENT 타입에 한해서 시간을 재갱신한다.
#define  BF_POLICY_CLOSE_OFF_LINK  (1<<3 )        /// SOCK_TYPE_SERVER_CLIENT 타입에 한해서 하드웨어적인 링크가 끊어지면 접속을 끊는다.
#define  BF_POLICY_READ_ZERO_ERROR (1<<4 )        /// read() 함수에서 읽은 값이 0이면 에러처리한다. (소켓접속이 끊어진 후 계속적으로 read 0 이벤트가 호출되는것을 막는다)
#define  BF_POLICY_WRITE_NONBLOCK  (1<<5 )        /// write() 함수를 호출할때 버퍼가 사용가능한지 확인하기 위해 POLLOUT 이벤트를 확인한다.


/// 기타상수
#define  DEFAULT_LIVE_SEC          (3600)


#ifdef __cplusplus 
extern "C" { 
#endif 	

/// @{
/// @brief  외부에서 사용할수 있는 객체함수 리스트

#ifdef EMBEDDED_LINUX

void         tcp_set_policy( unsigned int option );                  /// tcp 정책을 설정한다
unsigned int tcp_get_policy( void );                                 /// tcp 정책을 얻는다.
void         tcp_set_livesec( int sec );                             /// 통신이 일정시간 없으면 접속을 끊는데 사용하는 시간을 설정한다.

#endif

poll_obj_t  *tcp_open_server( int port, int max_client );            /// tcp 소켓을 서버형태로 open 한다.
poll_obj_t  *tcp_open_client( char *ip, int port );                  /// tcp 소켓을 클라이언트 형태로 open 하고 상대편에 접속한다
//poll_obj_t  *tcp_connect_client( poll_obj_t *obj_server, int sockfd, struct sockaddr_in *paddr ); /// 클라이언트 소켓의 접속을 폴관린 객체에 등록한다.
void         tcp_close( poll_obj_t *obj );                           /// tcp 소켓을 close 한다.
poll_obj_t  *tcp_accept_client( poll_obj_t *obj_server );            /// tcp 소켓의 접속요구를 처리한후 클라이언트소켓을 등록한다.
int          tcp_write( poll_obj_t *obj, char *buf, int len );       /// tcp 소켓을 통해 데이타를 전송한다.
int          tcp_read( poll_obj_t *obj, char *buf, int len );        /// tcp 소켓을 통해 데이타를 읽는다.
int          tcp_check_time( poll_obj_t *obj );                      /// 일정시간이 지난을때 호출되며 tcp 정책에 의해 일을 수행한다.

int          tcp_client_count( poll_obj_t *obj_server );             /// tcp 서버에서 접속된 소켓의 개수를 얻는다.
poll_obj_t  *tcp_get_client( poll_obj_t *obj_server, int idx );      /// tcp 서버에서 인덱스로 접속된 소켓 폴 객체를 얻는다.
poll_obj_t  *tcp_get_server( poll_obj_t *obj_client );               /// tcp 클라이언트 폴객체에서 서버객체를 얻는다.

int          tcp_write_thread( poll_obj_t *obj, char *buf, int len );/// 쓰레드를 생성하여 데이타를 전송한다.

const char  *tcp_peer_ip_string( poll_obj_t *obj_client );           /// 연결된 상대편의 IP 문자열을 얻는다.

/// @}

#ifdef __cplusplus 
}
#endif 

#endif