00001 #include <iostream> 00002 #include <fstream> 00003 #include <cstring> 00004 #include <stdlib.h> 00005 #include <sys/socket.h> 00006 #include <netinet/in.h> 00007 #include <arpa/inet.h> 00008 #include <strings.h> 00009 #include <pthread.h> 00010 00012 #define BACKLOG 5 00013 00015 #define MAX_LINE_LEN 1024 00016 00018 #define DIMBLOCK 128*sizeof(char) 00019 00020 using namespace std; 00021 00023 char *SERVER_IP_ADD; 00024 00026 int SERVER_PORT; 00027 00029 const char *config_file_path; 00030 00032 char line[MAX_LINE_LEN]; 00033 00035 pthread_mutex_t m_acc; 00036 00044 struct client_list { 00046 int cl_ID; 00048 bool valid; 00050 bool lock; 00052 client_list *succ; 00053 }; 00054 00063 struct block { 00065 int ID; 00067 void *pointer; 00069 pthread_mutex_t b_acc; 00071 client_list *cl_ptr; 00073 block *succ; 00074 }; 00075 00081 class Server { 00083 block *head; 00084 00093 void add_block(int id_block); 00094 00103 block * find_block(int id); 00104 00114 client_list * find_client(int client_id, block *bk_elem); 00115 00124 void add_client(int client_id, block *bk_elem); 00125 00134 void delete_client(int client_id, block *bk_elem); 00135 00146 void change_valid(int client_id, block *bk_elem); 00147 00159 int client_unblock(int client_id, block *bk_elem); 00160 00161 public: 00169 Server(); 00170 00179 int port_control(int port); 00180 00190 void read_config_file(const char *config_file); 00191 00204 int block_map(int sk); 00205 00217 int block_unmap(int sk); 00218 00236 int block_update(int sk); 00237 00256 int block_write(int sk); 00257 00270 int block_wait(int sk); 00271 }; 00272 00273 00274 00275