Linux

兩個文件描述符(客戶端)之間的通信

  • October 23, 2019

我正在關注這份文件

我很難理解文件描述符以及如何從一個文件描述符中讀取數據、處理它然後發送到另一個文件描述符。

作為伺服器,我需要能夠接受連接、接收數據、處理數據,然後將其傳遞給另一個客戶端。

昨天我被介紹了 epolling,我想知道我的策略對於創建客戶端-伺服器網路是否正確。

創建了一個 epollfd。我將其指定為邊沿觸發 (EPOLLET) 和非阻塞(使用:flags |= 0_NONBLOCKfctnl(epollfd, F_SETFL, flags).

我的意圖是現在創建一個networkfds(客戶端套接字)數組並監聽連接/消息。

  1. 獲取有關新數據的通知
  2. 讀取數據
  3. 處理數據
  4. 將一些數據寫入另一個套接字。

我在 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,希望我不會太遠。請告訴。

引用自:https://unix.stackexchange.com/questions/547322