2010-03-22 108 views
1

我在VS.NET中有兩個單獨的套接字項目。其中之一是發件人,另一個是收件人。啓動接收器後,我從發件人發送數據。儘管發送方法在成功傳輸時返回13個字節,但接收器接收到0(零)。接收方接受發送方套接字並收聽。但無法接收數據。爲什麼?有關套接字通信的問題

P.S. :如果發送者代碼放在接收者項目中,接收者也可以獲取數據。

+0

需要查看更多代碼,您如何建立連接併發送數據? – NibblyPig 2010-03-22 11:47:35

回答

1

我認爲這個問題是發送應用程序在結束之前接收器可以讀取數據。如果在Send調用後加上Thread.Sleep(1000);,接收應用程序將讀取數據(至少在我測試時)。

0

這很可能是您的代碼中的一個錯誤,但沒有看到代碼就無法辨別。

但是請注意,TCP/IP沒有消息的概念,只有數據流。所以發送13個字節並在一次讀取中接收6個字節並在下一個字節中接收7個字節是可能的。或者反過來發送13個字節,然後再發送7個字節,並在接收端將它們接收爲20個字節的單個塊。

0

非常感謝您的關注。 這裏是代碼:

/***********************************接收者*** *******************/

類節目 { 靜態無效的主要(字符串[]參數) { 接收機的recv =新的接收器(); recv.Start();
}}

public class Receiver 
{ 
    public void Start() 
    { 
     Socket gateSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
     gateSocket.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8999)); 
     gateSocket.Listen(12); 

     Thread thGateListen = new Thread(new ParameterizedThreadStart(GateListener)); 
     thGateListen.Start(gateSocket); 
    } 

    public void GateListener(object obj) 
    { 

     Socket gateSocket = (Socket)obj; 

     for (; ;) 
     { 
      Socket newRequest = gateSocket.Accept(); 
      Console.WriteLine("New Connection Request"); 
      Thread thReadData = new Thread(new ParameterizedThreadStart(ReadFromSocket)); 
      thReadData.Start(newRequest); 
     } 
    } 


    public void ReadFromSocket(object obj) 
    { 
     Socket s = (Socket)obj; 
     for (; ;) 
     { 
      if (s.Available > 0) 
      { 
       byte[] buffer = new byte[s.Available]; 
       s.Receive(buffer); 
       Console.WriteLine(System.Text.Encoding.ASCII.GetString(buffer)); 
      } 
     } 
    } 

} 

/*********發件人* *********************/

類節目 { 靜態無效的主要(字符串[]參數) { 發送器S =新發件人() ; s.Send(「Hello Socket!」); }}

class Sender 
{ 
    public void Send(string s) 
    { 
     Socket sendSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
     sendSocket.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8999)); 

     sendSocket.Send(System.Text.Encoding.ASCII.GetBytes(s)); 
    } 

} 
+0

不能只有一個進程打開機器上的一個端口嗎? – kenny 2010-03-22 12:30:45

+0

我認爲發件人程序在Receiver程序收到數據之前終止。在發送程序中發送()之後進行一些睡眠並看看它是否有效。 – kumar 2010-03-22 13:09:35