c#套接字帮助

时间:2010-09-07 09:50:27

标签: c# sockets

我对使用C#的套接字编程完全不熟悉,我正试图让两个正在运行的.exes与彼此交谈:

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)总是为真)。

请帮助,谢谢。

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:1)

您的服务器代码中没有接受传入连接的位置。您必须在服务器端accept and create a socket为新的传入客户端。

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