兩個文件描述符(客戶端)之間的通信
我很難理解文件描述符以及如何從一個文件描述符中讀取數據、處理它然後發送到另一個文件描述符。
作為伺服器,我需要能夠接受連接、接收數據、處理數據,然後將其傳遞給另一個客戶端。
昨天我被介紹了 epolling,我想知道我的策略對於創建客戶端-伺服器網路是否正確。
創建了一個 epollfd。我將其指定為邊沿觸發 (EPOLLET) 和非阻塞(使用:
flags |= 0_NONBLOCK
和fctnl(epollfd, F_SETFL, flags)
.我的意圖是現在創建一個networkfds(客戶端套接字)數組並監聽連接/消息。
- 獲取有關新數據的通知
- 讀取數據
- 處理數據
- 將一些數據寫入另一個套接字。
我在 linux man 和 online 中找到的所有範例僅提供有關如何從套接字讀取數據的資訊,如果我嘗試讓多個客戶端實際上同時與多個客戶端通信,我擔心我的設計是愚蠢的並且由於失敗。
我決定在這裡問,因為我讀到了 NGINX(網路伺服器正在使用 epolling)
任何人都可以幫忙嗎?
編輯1:我打算在列表(struct epoll_event *events)中有(許多)套接字並通過epoll_wait()訪問它們。
// If I understand correctly: int ndfs = epoll_wait(epollfd, events, MAX_EVENTS, -1); // Puts some events in the <events> array and an int in ndfs
nfds``events
現在應該包含可以使用 for 循環遍歷的可用 fd 的數量。這就是我從手冊中理解的。一旦我收到其中一個消息,我希望能夠處理它(即讀取它的內容並做出決定)並最終觸發對另一個套接字的寫入。
我這樣做是為了避免多執行緒。這是可以實現的嗎?
問題是“你想寫給哪一個?”
假設您有兩個客戶端套接字,那麼很容易,在 socket_fd1 上讀取(或 recv()),在 socket_fd2 上寫入(或 send())。就這麼簡單。
在 C 中,沒有什麼要求您“回复”客戶
您是否需要回复客戶端(或另一個)與您要實現的協議/應用程序有關。
隨著更多套接字打開,唯一的問題是“數據去哪兒了?”。
您甚至可以將相同的數據發送到所有客戶端套接字。將 fds 保存在 table/list/whatsoever 中,並為每個條目 “fd” 呼叫 send(fd, buf, size, flags);
(聽起來您正在嘗試編寫一種聊天服務,因此您將發送給除接收者之外的所有人:)
如果選擇要發送給誰更複雜,請使用包含每個客戶更多資訊的結構表來做出決定。
希望能解決您的問題。
可能是您沒有充分區分:
文件描述符(fd),以及
插座。
你提到“networkfds”。我猜它們是臨界的,就像 NFS 文件在某些情況下可能是特殊的。它不是一個文件,而是一個 NFS 文件。
重要的是,因為有狀態的 TCP 協議,輪詢 fd 是套接字不需要的。(如果我更確定的話,我會加粗這個。)
一個原始的 UDP 套接字對類似於一對 fd:連接已準備好,但是如何組織數據流呢?解釋“網際網路”協議 TCP 的普遍性(IP 只是下面的一層,更靜態,也很重要。參見維基百科!)。
所以你的設計是愚蠢的嗎?根據定義,是的,有點原始。與 TCP/IP 相比。文件描述符是 IO 流的單一聯繫人,套接字是網際網路時代的豪華插頭。有
connect
等僅用於套接字。這對你有意義嗎?我半路可以跟隨你的Q,希望我不會太遠。請告訴。