2010-09-07 121 views
1

我完全新的插座用C#編程,我試圖得到兩個運行.EXE文件交談海誓山盟:C#插座幫助

static void Main(string[] args) { 
    bool sender = !false; 
    if (args.Length > 0) sender = !true; 
    if (sender) { 
     try { 
      Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP); 
      IPEndPoint ipe = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8221); 
      sock.Connect(ipe); 
      while (true) { 
       string toSend = Console.ReadLine(); 
       sock.Send(Encoding.UTF32.GetBytes(toSend)); 
      } 
     } 
     catch (SocketException e) { 
      Console.WriteLine(e.Message); 
      Console.ReadLine(); 
     } 
    } 
    else { 
     try { 
      Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP); 
      IPEndPoint ipe = new IPEndPoint(IPAddress.Any, 8221); 
      sock.Bind(ipe); 
      sock.Listen(4); 
      while (true) { 
       if (!sock.Connected) continue; 
       byte[] buffer = new byte[1024]; 
       if (sock.Receive(buffer) > 0) Console.WriteLine(Encoding.UTF32.GetString(buffer)); 
      } 
     } 
     catch (SocketException e) { 
      Console.WriteLine(e.Message); 
      Console.ReadLine(); 
     } 
    } 
} 

此刻雖然,這兩個程序運行沒有錯誤,但他們似乎並沒有連接(如果(!sock.Connected)總是正確的)。

請幫忙,謝謝。

+1

什麼是!true和!false。完全沒有意義。 – 2010-09-07 09:54:04

+0

啊,是的,呃...我在視覺工作室測試它,但我想用調試器測試程序的另一半,所以不是大驚小怪,而是翻轉了真實/錯誤。 – Xenoprimate 2010-09-07 09:57:36

+0

當他們無法連接(在'sock.Connect(ipe)'聲明)時,你會得到一個異常嗎? 「連接」不是真正的連接狀態,而是一個標誌,說上次發送或接收是否成功 – Patrick 2010-09-07 10:02:30

回答

1

沒有在您的服務器代碼中接受傳入連接的位置。您將不得不在服務器端爲新進來的客戶端提供accept and create a socket

Socket newSock = sock.Accept(); 
if (!newSock.Connected) continue; 
else 
{...} 
2

編輯:注意到您的偵聽器中沒有sock.Accept()。您需要獲得一個可以「聊天」的傳入套接字。放置Socket c = sock.Accept()while(true)循環前和使用c套接字來發送和接收數據

Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP); 
IPEndPoint ipe = new IPEndPoint(IPAddress.Any, 8221); 
sock.Bind(ipe); 
sock.Listen(4); 

Socket c = sock.Accept(); // added 

while (true) { 
    if (!c.Connected) continue; 
    byte[] buffer = new byte[1024]; 
    if (c.Receive(buffer) > 0) Console.WriteLine(Encoding.UTF32.GetString(buffer)); 
} 

;及作爲一個建議,每當我編寫套接字程序時,我通常會在實際緩衝區之前發送要發送的字節數。如果你能夠讓你的發送者和監聽者連接,這可能是他們交換數據的修復。

public void send(byte[] buf) { 
    socket.Send(BitConverter.GetBytes(buf.Length), SocketFlags.None); 
    socket.Send(buf, buf.Length, SocketFlags.None); 
} 

public byte[] receive() { 
    byte[] lengthBytes = new byte[4]; 
    int read = socket.Receive(lengthBytes); 
    // read contains the number of read bytes, so we can check it if we want 
    int length = BitConverter.GetInt32(lengthBytes); 
    byte[] buf = new byte[length]; 
    socket.Receive(buf); 
    return buf; 
} 
+0

我只是在構造一個答案 - 你你先到那裏:) - 批判地說,你需要Recieve函數調用... – Ragster 2010-09-07 10:13:33

+0

我確實有.Receive()? :) – Xenoprimate 2010-09-07 10:15:07

+0

@Motig:是的,但不是在不知道它是什麼的情況下接收數據,而是首先發送字節數,這樣您的偵聽器就知道它應該接收多少數據。 – Patrick 2010-09-07 10:16:45