#ifndef __DY_SOCKET_SERVER_SESSION_H
#define __DY_SOCKET_SERVER_SESSION_H
#include <arpa/inet.h>
#include <pthread.h>
#include "lnxall_list.h"
#include "dy_utils/dy_common.h"

#define SOCKET_DO_RCV_MASK (1<<1)
#define SOCKET_DO_SND_MASK (1<<2)

/*************ENUM*************************/
typedef enum
{
	SOCKET_TCP,
	SOCKET_UDP,
}socket_type_e;
/******************************************/

typedef struct socket_data_node_s {
    struct list_head list;
	int client_fd;
	char user_param[128];
    int buf_len;
    char buf[0];
} socket_data_node_t;

typedef struct socket_connect_node_s {
    struct list_head list;
	char hostname[64];
	int socket_fd;
} socket_connect_node_t;

typedef struct socket_session_s {
    struct list_head rcv_list; //收到的消息列表
    struct list_head snd_list; //待发送队列
    struct list_head connect_list; //待发送队列
    socklen_t socklen;
    struct sockaddr_in server_addr;
	fd_set master;
    int (*handle_recv_msg)(struct socket_session_s *session, int client_fd, char *buf, int len);
	int (*handle_client_up_down)(struct socket_session_s *session, int up, char *hostname, int socket_fd);
	int (*handle_data_send_status)(struct socket_session_s *session, int client_fd, int status, char *user_param);
    pthread_mutex_t sock_lock;
    pthread_cond_t sock_cond;
	socket_type_e type;
    int server_sockfd;
    int op_code;
	char socket_server_addr[32];
	int socket_server_port;
    int connected;
	char sn[SN_MAX_LEN];          ///<设备SN
} socket_server_session_t;

int dy_socket_server_session_snd(socket_server_session_t *session, int client_fd, char *buf, int len, char *user_param);
int dy_session_close_client(socket_server_session_t *session, int socket);
int dy_socket_server_session_init(socket_server_session_t *session);
#endif
