2010-03-22 110 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