教你開發乙個高效的伺服器

2021-05-11 15:18:47 字數 2800 閱讀 6374

cpp** 

typedef

struct server_st *server_t;  

typedef

struct task_queue_st *task_queue_t;  

typedef

struct conn_st *conn_t;  

/** 伺服器結構 */

struct server_st ;  

/** 任務佇列結構 */

struct task_queue_st ;  

/** 使用者的階段狀態 */

typedef

enum  client_status_t;  

/** 伺服器的階段狀態 */

typedef

enum  server_status_t;  

/** 連線結構 */

struct conn_st ;  

/** 主函式 */

int main(int argc, char **argv)   

/* 建立5個負責寫資料的任務執行緒 */

for (idx = 0; idx < 5; idx++)   

/* 無限迴圈的監聽,等待客戶端的連線請求 */

while (1)   

return 0;  

}  /*分配任務,原則為哪個執行緒的任務佇列最少就分配給哪乙個執行緒去處理*/

static

void assign_to_readreq_task_thread(server_t server, int conn_fd)   

if (min_task_queue)   

}  /**

*負責讀取請求的任務執行緒處理主函式,負責管理,處理自己佇列中的所有連線

*/static

void *readreq_task_thread(void *arg)  else   

task_queue->conn_tail = conn;  

}  pthread_mutex_unlock(&task_queue->task_queue_mutex);  

if (task_queue->total_conns == 0)   

conn = task_queue->conn_head;  

while (conn)  else   

} else   

conn = conn->readreq_task_queue_next;  

close(discarded_conn->fd);/*真正關閉連線的地方*/

free(discarded_conn);  

} else  else   

prev_conn = conn;  

conn = conn->readreq_task_queue_next;  

}  }  

/** 堵塞等待,超時時間為poll_timeout毫秒*/

continue;  

/*** 迴圈查詢向我們傳送請求的客戶端的連線

*/for (i = 0; i < ready; i++)  else

conn->client_status = status_closed;  

}  }  

}  }  

/* 協議處理函式 */

void proc_protocol(conn_t conn)   

/*分配任務,原則為哪個執行緒的任務佇列最少就分配給哪乙個執行緒去處理*/

static

void move_to_writedata_task_thread(conn_t conn)   

if (min_task_queue)   

}  /**

*負責寫資料的執行緒處理主函式,負責管理,處理自己佇列中的所有連線

*/static

void *writedata_task_thread(void *arg)  else   

task_queue->conn_tail = conn;  

}  pthread_mutex_unlock(&task_queue->task_queue_mutex);  

if (task_queue->total_conns == 0)   

conn = task_queue->conn_head;  

while (conn)  else   

} else   

conn = conn->writedata_task_queue_next;  

discarded_conn->ref_count--;/*引用計數減一,並且該連線已經關閉了,那麼真正關閉連線的任務就交給readreq_task_thread函式了*/

} else  else   

prev_conn = conn;  

conn = conn->writedata_task_queue_next;  

}  }  

/**堵塞等待,超時時間為poll_timeout毫秒*/

continue;  

/*** 迴圈查詢向我們傳送請求的客戶端的連線

*/for (i = 0; i < ready; i++)   

if(nwrite < nread)   

} else

if(nread == 0)   

} else   

if(nwrite < conn->remain_data_size)  else   

}  } else

conn->client_status = status_closed;  

}  }  

}  }  

自己動手開發乙個 Web 伺服器(一)

自己動手開發 web 伺服器 會分為三個部分,將介紹如何從頭開發乙個簡易 web 伺服器。我們這就開始吧。首先,到底什麼是 web 伺服器?http請求 響應 簡而言之,它是在物理伺服器上搭建的乙個網路連線伺服器 networking server 永久地等待客戶端傳送請求。當伺服器收到請求之後,它...

編了乙個伺服器

伺服器 include 包含socket 2版本的標頭檔案 include include pragma comment lib,ws2 32.lib 呼叫網路動態庫!int tmain int argc,tchar argv word sockversion 0x0002 定義版本號 sockve...

使用go語言開發的乙個非同步伺服器

大約是2016年7月,我開始學習go語言開發。目標是開發自己的伺服器,從 入手呢?想找乙個伺服器 來學習如何使用go語言寫伺服器,畢竟我是搞後台的。但是我搜尋了一番,沒有找到乙個像樣的,比較多的資料是go 語言的web程式設計,當然了,有幾本這樣的書了。有的都是些東拼西湊的東西,根本跑不起來。學得差...