最大連線數的限制
在session結構體重增加乙個num_clients成員,在主線程式中,每當來乙個客戶端就使num_clients++。子程序在開啟會話前要進行最大連線數限制的檢查,只有小於最大連線數的限制才開啟會話。那麼子程序退出的時候如何對num_clients進行維護呢?
void
check_limits
(session_t *sess)
}
每ip數登入的限制
要實現每ip數登入的限制,需要實現兩個hash表:ip–count表和pid–ip表
實現雜湊表:
hash.h
#ifndef _hash_h_
#define _hash_h_
typedef
struct hash hash_t;
typedef
unsigned
int(
*hashfunc_t)
(unsigned
int,
void*)
;hash_t*
hash_alloc
(unsigned
int buckets, hashfunc_t hash_func)
;void
*hash_lookup_entry
(hash_t *hash,
void
* key,
unsigned
int key_size)
;void
hash_add_entry
(hash_t *hash,
void
*key,
unsigned
int key_size,
void
*value,
unsigned
int value_size)
;void
hash_free_entry
(hash_t *hash,
void
*key,
unsigned
int key_size)
;#endif
hash.c
#include
"hash.h"
#include
"hash.h"
#include
"common.h"
#include
typedef
struct hash_node
hash_node_t;
struct hash
;hash_node_t*
*hash_get_bucket
(hash_t *hash,
void
*key)
;hash_node_t*
hash_get_node_by_key
(hash_t *hash,
void
*key,
unsigned
int key_size)
;hash_t *
hash_alloc
(unsigned
int buckets, hashfunc_t hash_func)
void
*hash_lookup_entry
(hash_t *hash,
void
* key,
unsigned
int key_size)
return node->value;
}void
hash_add_entry
(hash_t *hash,
void
*key,
unsigned
int key_size,
void
*value,
unsigned
int value_size)
hash_node_t *node =
malloc
(sizeof
(hash_node_t));
node->prev =
null
; node->next =
null
; node->key =
malloc
(key_size)
;memcpy
(node->key, key, key_size)
; node->value =
malloc
(value_size)
;memcpy
(node->value, value, value_size)
; hash_node_t *
*bucket =
hash_get_bucket
(hash, key);if
(*bucket ==
null
)else
}void
hash_free_entry
(hash_t *hash,
void
*key,
unsigned
int key_size)
free
(node->key)
;free
(node->value);if
(node->prev)
else
if(node->next)
node->next->prev = node->prev;
free
(node);}
hash_node_t*
*hash_get_bucket
(hash_t *hash,
void
*key)
return
&(hash->nodes[bucket]);
}hash_node_t*
hash_get_node_by_key
(hash_t *hash,
void
*key,
unsigned
int key_size)
while
(node !=
null
&&memcmp
(node->key, key, key_size)!=0
)return node;
}
定義兩個hash表:
s_ip_count_hash =
hash_alloc
(193
, hash_func)
; s_pid_ip_hash =
hash_alloc
(193
, hash_func)
;
在session會話結構體中新增num_this_ip成員。在主線程式中,父程序登記pid–ip表。在主線程式中,來乙個客戶端:
unsigned
inthandle_ip_count
(void
*ip)
else
//否則給對應的count++
return count;
}
那麼在ftp程序退出的時候,如何維護呢?之前的程序模型,對子程序結束之後發出的訊號設定忽略,防止產生殭屍程序。現在對該程序模型進行一定的修改:
signal
(sigchld, handle_sigchld)
;
主線程序收到子程序結束發來的sigchld訊號會執行handle_sigchld函式。
void
handle_sigchld
(int sig)
//減少ip對應的count
drop_ip_count
(ip)
;//然後釋放該pid--ip節點
hash_free_entry
(s_pid_ip_hash,
&pid,
sizeof
(pid));
}}void
drop_ip_count
(void
*ip)
//count--
count =
*p_count;
--count;
*p_count = count;
//如果count減少到0,則釋放ip--count節點
if(count ==0)
}
miniftp專案總結(三)
struct stat 結構體 dirent struct dirent const char statbuf get perms struct stat sbuf if mode s irusr if mode s iwusr if mode s ixusr if mode s irgrp if ...
miniftp專案總結(七)
空閒斷開 當客戶端夠多的時候,伺服器的壓力很大。客戶端連線進行一些短時的操作,操作完成之後,空閒時間達到一定的程度,就會斷開。如何實現這個功能?kill l設定鬧鐘的函式 void start cmdio alarm void 在ftppro中接收客戶端命令的語句之前,收到鬧鐘訊號之後的處理函式 v...
工作專案總結 八 之TCP IP通訊
104 查詢遠端埠已建立的連線,讀取字串 獲取字串 ipendpoint endpoint tcpclient.client.remoteendpoint as ipendpoint 建立遠端埠監聽 tcplistener listener new tcplistener endpoint cons...