c语言怎么在服务器端查询进程列表,C语言 在服务器端识别客户端的方法
我正在用C創建客戶端 – 服務器應用程序.服務器將接受來自多個客戶端的請求每個客戶在服務器上創建個人帳戶.身份驗證后,我知道客戶端使用特定的ip登錄到特定帳戶.現在我想確定哪些請求考慮特定帳戶,例如:
客戶A登錄:
username: user
password: pass123
服務器發現這些數據與id = 3的帳戶匹配.
現在當這個客戶端A發送一些請求時,我希望服務器訪問(并最終改變)id = 3的帳戶.到目前為止,我已經提出了這兩個想法:
>我有一個std :: map,其中key是客戶端ip,值是帳戶ID.在身份驗證之后,服務器將客戶端的ip及其帳戶ID存儲到此映射中,稍后當服務器收到來自客戶端的請求時,它會檢查它的ip并在映射中查找它.
>我有一個std :: map,其中key是隨機生成的key,value是account id.驗證后,服務器為此特定客戶端生成隨機密鑰,將此密鑰發送給客戶端,客戶端將其保存以供進一步使用,服務器將此密鑰和帳戶ID存儲在映射中.
我想知道這些是否是處理這類問題的好方法.哪一個更好,還考慮安全性(這對我來說非常重要)?還是有更好的方法?
1) I have a std::map where key is client ip and value is account id. After authentication, server stores client’s ip and it’s account id into this map and later when server receives request from client, it checks it’s ip and looks for it in map.
IP本身是不夠的:可以有幾個不同的客戶端連接來自同一個IP(來自同一臺計算機,或來自NAT后面的不同計算機,因此您只能看到NAT IP).如果您需要基于IP的唯一密鑰,則需要使用客戶端的IP /端口元組.
2) I have a std::map where key is randomly generated key and value is account id. After authentication, server generates random key for this specific client, sends this key to client, client saves it for further use, server stores this key and account id in map.
這是非常危險的:什么禁止客戶端發送另一個客戶端的“會話ID”而不是他的一個,從而劫持了另一個客戶端的會話?這與您可能想要閱讀的HTTP會話劫持問題完全相同.簡而言之:如果你能避免它,就不要這樣做.
其他可能的方案:
>仍然使用std :: map,您可以使用套接字句柄作為密鑰:它在服務器上必然是唯一的,因此不會產生混淆,并且它使您無需在每條消息中檢索客戶端的IP /端口.
>如果您的服務器使用舊的“每個連接一個線程”模型,那么您不必跳過這些環節.只需將會話數據與線程本地存儲變量相關聯即可.或者,幾乎所有線程庫都允許您將參數傳遞給線程,這可用于將特定數據與您的線程相關聯(請參閱下面的示例).
>如果您的服務器使用舊的“每個連接一個進程”模型(fork),那么它就更容易了,每個進程都有自己的變量,因此您沒有任何特殊操作.
不幸的是,只要我們不知道你的服務器使用的模型(線程,分叉,選擇,aio,……?),你的問題就是開放式的,所以你很難給出明確的答案.
如果您使用的是線程模型,這里(大致)我通常如何做(C 11線程,但任何其他線程庫也可以這樣做):
class ClientSession {
public:
ClientSession(int sock)
: m_sock(sock),
m_thread(&ClientSession::threadFunction, this)
{
}
private:
int m_sock;
WhateverType m_someSessionVariable;
std::thread m_thread; // the thread object should be declared last so that
// it is initialised last in the constructor, thus avoiding race conditions
// during the initialisation (you really don't want the thread to access
// your member variables if they are not yet initialised!)
static void threadFunction(ClientSession* object) {
object->threadMethod();
}
void threadMethod() {
// handle your connection
// the current ClientSession object (this) *is* your session
// put whatever you want in it, eg. m_someSessionVariable
}
};
//...
int sock_client = TEMP_FAILURE_RETRY(accept(sock_server, 0, 0));
if (sock_client >= 0)
new ClientSession(sock_client);
警告:顯然這段代碼有缺陷,它永遠不會破壞ClientSession對象,因此它有內存泄漏但我的目的是展示如何將一個線程與一個特定的會話對象相關聯,我將留給你管理對象的生命周期取決于您的確切架構和需求.
總結
以上是生活随笔為你收集整理的c语言怎么在服务器端查询进程列表,C语言 在服务器端识别客户端的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言while计算机编写,计算机等级考
- 下一篇: drupal linux安装,在Debi