2011-04-03 31 views
0

我正在使用C型TCP套接字send()recv()。我有一個連接在用戶A和用戶B之間運行,用戶A充當服務器,用戶B充當客戶機。如何在會話期間獲得新的套接字連接?

我想要一個被動用戶C,它不會傳遞任何東西,但會接收來自用戶A的數據。但是,新的被動用戶C可以隨時加入會話。 A可能會發送C不同的數據包,比發送B的數據包數量多得多。我想最好是AC在不同於AB的端口上進行通信。如何在一個不同的端口上進行此連接(不使用線程或類似方法)任意的溝通點?

編輯仍未解決。

+0

是C++對你而言好嗎? – sehe 2011-04-03 22:00:33

+0

是的,C++沒問題。但是我現在正在使用c-unix風格的套接字。無論哪種方式,真的 – cellpho 2011-04-03 22:22:49

回答

1

您可以設置偵聽器來檢測新連接,並將流量鏡像到所有打開的套接字。我最近在C#中寫了我的意思:(我會看看我是否可以快速將其轉換爲C樣本)

此示例僅在開始時接受固定數量的傳入連接,但它很容易更改那。

using System; 
using System.Collections.Generic; 
using System.Net; 
using System.Net.Sockets; 
using System.Text; 
using System.Linq; 

public class Demo 
{ 
    static IList<Socket> StartServer(int numberOfClients) 
    { 
     using(Socket main = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) 
     { 
      main.Bind(new IPEndPoint(IPAddress.Any, 9050)); 
      main.Listen(numberOfClients); 

      var clients = Enumerable 
       .Range(1,numberOfClients) 
       .Select(i => { 
         Console.WriteLine("Waiting for 1 more client..."); 
         Socket client = main.Accept(); 
         Console.WriteLine("Connected to {0}", client.RemoteEndPoint);  
         return client; }) 
       .ToList(); 
      main.Close(); 

      return clients; 
     } 
    } 

    public static void Main() 
    { 
     var clients = StartServer(4); 

     while(clients.Count()>1) // still a conversation 
     { 
      var copyList = clients.ToList(); 
      Console.WriteLine("Monitoring {0} sockets...", copyList.Count); 
      Socket.Select(copyList, null, null, 10000000); 

      foreach(Socket client in copyList) 
      { 
       byte[] data = new byte[1024]; 
       int recv = client.Receive(data); 

       if (recv == 0) 
       { 
        Console.WriteLine("Client {0} disconnected.", client.RemoteEndPoint); 
        client.Close(); 
        clients.Remove(client); 
       } 
       else 
        foreach (var other in clients.Except(new [] {client})) 
         other.Send(data, recv, SocketFlags.None); 
      } 
     } 
     Console.WriteLine("Last client disconnected, bye"); 
    } 
} 
+0

概念是正確的。用戶C連接到服務器A.當服務器A檢測到用戶C已連接時,它將B發送給它的也發送給C。這基本上是如何聊天服務器工作 – Matt 2011-04-03 22:01:23

+0

感謝您的答案。我對部分內容發生了些什麼不清楚。如果服務器向C發送不同的消息,這將如何工作? – cellpho 2011-04-03 22:26:45

0

您可以簡單地在服務器A上打開2個套接字,然後將它們綁定到2個不同的端口上。 然後在2個創建的套接字文件描述符上使用select函數。

當兩個客戶端中的一個進行連接時,選擇將首次返回。請記住,在服務器端,在接受連接之後,應該設置返回的新文件描述符(使用FD_SET),以便選擇偵聽將在新套接字上發生的事件(從接受方返回)。

相關問題