0

我有一个基本的 IRC 客户端,它向服务器发送命令。在规范中它说该PASS命令可以有 2 个数字回复 ERR_NEEDMOREPARAMS ERR_ALREADYREGISTRED

当我发送命令时,如果密码正确,则不会有回复,但如果密码不正确,我将得到两者之一。NICK但是因为我的发送和接收是独立的,并且异步(使用等待异步)我在捕获错误并停止发送例程发送和USER/或任何其他命令的那一刻没有可靠的方法。

所以我的问题是,什么是捆绑读写的好方法,这样我可以在出现问题时立即停止,并且通常随时严格控制通信。

4

2 回答 2

0

好了,一个简单的同步客户端套接字示例:

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

public class SynchronousSocketClient {

public static void StartClient() {
    // Data buffer for incoming data.
    byte[] bytes = new byte[1024];

    // Connect to a remote device.
    try {
        // Establish the remote endpoint for the socket.
        // This example uses port 11000 on the local computer.
        IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName())
        IPAddress ipAddress = ipHostInfo.AddressList[0];
        IPEndPoint remoteEP = new IPEndPoint(ipAddress,11000);

        // Create a TCP/IP  socket.
        Socket sender = new Socket(AddressFamily.InterNetwork, 
            SocketType.Stream, ProtocolType.Tcp );

        // Connect the socket to the remote endpoint. Catch any errors.
        try {
            sender.Connect(remoteEP);

            Console.WriteLine("Socket connected to {0}",
                sender.RemoteEndPoint.ToString());

            // Encode the data string into a byte array.
            byte[] msg = Encoding.ASCII.GetBytes("This is a test<EOF>");

            // Send the data through the socket.
            int bytesSent = sender.Send(msg);

            // Receive the response from the remote device.
            int bytesRec = sender.Receive(bytes);
            Console.WriteLine("Echoed test = {0}",
                Encoding.ASCII.GetString(bytes,0,bytesRec));

            // Release the socket.
            sender.Shutdown(SocketShutdown.Both);
            sender.Close();

        } catch (ArgumentNullException ane) {
            Console.WriteLine("ArgumentNullException : {0}",ane.ToString());
        } catch (SocketException se) {
            Console.WriteLine("SocketException : {0}",se.ToString());
        } catch (Exception e) {
            Console.WriteLine("Unexpected exception : {0}", e.ToString());
        }

    } catch (Exception e) {
        Console.WriteLine( e.ToString());
    }
}

public static int Main(String[] args) {
    StartClient();
    return 0;
   }
}
于 2013-06-23T21:40:09.880 回答
0

没有必要避免发送NICKUSER直到PASS被接受或拒绝 - 正如您所指出的,您实际上无法知道它是否已被接受。

您应该立即发送NICK,USERPASS命令,然后等待查看它们中的一个或任何一个是否被拒绝(在这种情况下,您将收到错误数字)或全部被接受(在这种情况下,您将得到一个RPL_WELCOME数字)。PASS注册命令的发送没有固定的顺序,例如,在发送了NICKand之后是否需要重新发送也没关系USER

于 2013-06-27T09:51:21.360 回答