miniftp專案總結(八)

2021-10-05 05:25:51 字數 4266 閱讀 5993

最大連線數的限制

在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...