2010-09-07 70 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