簡體   English   中英

點對點聊天中程序的多個實例之間的通信-C語言

[英]Communication among multiple instances of a program in peer to peer chat - C language

我正在編寫一個對等聊天程序。 在此程序中,客戶端和服務器功能被寫入一個唯一的文件中。 首先,我想問一下我程序中的機制是否正確。

  1. 我fork()兩個過程,一個用於客戶端功能,一個用於服務器功能。
  2. 在服務器進程中,我初始化套接字,執行bind(),listen()。 然后,我使用select()處理來自客戶端的多連接。 在客戶端進程中,我初始化套接字,執行connect()。
  3. 創建第一個對等方時,客戶端進程沒有任何服務器可連接,因此它僅等待直到其他對等方出現。 在這種情況下,我只需初始化一個套接字並等待。
  4. 當創建下一個對等節點時,它們的客戶端進程初始化套接字,執行connect()並將信息發送到第一個對等服務器的服務器進程,以請求加入。
  5. 在服務器進程中,我在select()返回之后接收信息,並將反饋發送到發件人的客戶端進程。

其次,例如,我的程序稱為“ p2p”。 我在一個終端(從我的程序)中啟動一個實例,假設通過運行“ p2p Name_of_group Port_Number_for_Server_Side ”來啟動P2P1 這是網絡的第一個對等點,它定義了一個組的名稱,一個要偵聽的端口。 現在,我運行另一個實例(在另一個終端中),通過運行“ p2p Name_of_group Port_Number_for_Server_Side來說P2P2 第二個對等方聲明要加入的組的名稱和偵聽其服務器進程的端口。

P2P2的客戶端進程通過將其信息發送到服務器進程P2P1來連接到P2P1的服務器進程。 但是,在這種情況下,P2P2的客戶端進程不知道套接字的值,該套接字被初始化為在P2P1的服務器進程中打開端口。 所以我的問題是,當P2P2要使用send()和recv()與P2P1通信時,如何從P2P1獲取此信息? 非常感謝您的回復。

第一個問題 :由於數據交換會更簡單,所以我寧願使用一個進程而不是兩個進程。 然后選擇單線程解決方案(select()不會從網絡中超時,也不會從用戶輸入循環中選擇)或兩個線程解決方案,我可能會留在2個線程中,這雖然稍微復雜一些,但對用戶。

其余機制似乎是正確的,但可能會根據第二個問題的要求而有所不同

第二個問題 :我認為您總是需要傳遞至少一個活動客戶端的hostname:port作為參數。

我將開發這種解決方案:如果未傳遞hostname:port,則客戶端將什么都不做(它可能是網絡的第一個節點); 如果存在此類信息,則客戶端應首先嘗試連接到給定地址。

在第一個聯系人之后應跟隨一個特殊命令,該命令使被聯系的服務器共享網絡中其他每個活動節點的信息。 在您的情況下,我將以“ p2p Name_of_group Port_Number_for_Server_Side Port_Number_of_P2P1 ”啟動P2P2。 然后

  • P2P2連接到P2P1並詢問其他節點
  • P2P1回答這是唯一的節點
  • 現在P2P1和P2P2都知道網絡是由兩個節點組成的

現在,您可以啟動一個P2P3,例如“ p2p Name_of_group Port_Number_for_Server_Side Port_Number_of_P2P1 ”或“ p2p Name_of_group Port_Number_of_Server_Side Port_Number_of_P2P2 ”。 假設您將其連接到P2P2

  • P2P3連接到P2P2,並要求其他活動節點
  • P2P2回復有關P2P1的地址信息
  • P2P3連接到P2P1,並且不要求任何內容(或者,如果您願意,可以冗余)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM