1

Windows 8 用の IRC クライアント アプリを作成しようとしています。問題が発生しました。私は、この pytho のチュートリアルから始めました: http://oreilly.com/pub/h/1968 次のコードになります (python 3.3 の場合)。クライアントをシャットダウンするまで、なんとかサーバーに接続し、認識されてログオンします。

server = "irc.location.net"
from socket import *

def main():
    s = socket(AF_INET, SOCK_STREAM)
    s.connect((server, 6667))
    readbuffer = ""
    s.send("NICK testIRC\r\n".encode())
    s.send("USER testIRC irc.location.net welcome :Test_IRC\r\n".encode())

    while 1:
        readbuffer = readbuffer + s.recv(1024).decode()
        temp = readbuffer.split("\n")
        readbuffer = temp.pop()

        for line in temp:
            line = line.rstrip();
            tokens = line.split(' ');

            if (tokens[0] == "PING"): 
                print("Got: %s\n" % line);
                response = "PONG %s\r\n" % tokens[1];
                s.send(response.encode())
                print("Sending: %s\n\n" % response)

if __name__ == "__main__":
    main();

次に、それを C# (.NET 4.5) に移植しようとしました。その結果を以下に示します。ただし、このコードは Python コードと同じ結果にはなりません。次のことが起こっている可能性があると思いますが、よくわかりません: サーバーがエンコーディングを認識していません (これは奇妙だと思います)。すべてをさらに奇妙にするために、キーのようなもの (何らかの 16 進値) を含む 1 つの ping を取得します。これにはもちろん、ポンで応答します。その最初の ping の後、何も受信しません。また、ユーザー リストにも表示されません。しかし、エンコーディングの問題以外は、何も考えられません。私のコードのエラーを見つけることができますか? よろしくお願いします。

StreamSocket ss = new StreamSocket();
await ss.ConnectAsync(new HostName(server_address), 6667.ToString());

DataWriter dw = new DataWriter(ss.OutputStream);
DataReader dr = new DataReader(ss.InputStream);
dr.InputStreamOptions = InputStreamOptions.Partial;

// Text related stuff
byte[] bytes;

// register
bytes = enc.GetBytes("NICK testIRC\r\n"); // enc is of type Encoding and is created as an UTF8Encoding.
dw.WriteBytes(bytes);
bytes = enc.GetBytes("USER testIRC irc.location.net welcome :Test_IRC\r\n");
dw.WriteBytes(bytes);
await dw.StoreAsync();
await dw.FlushAsync();

int ping_count = 0;

while (true)
{
    await dr.LoadAsync(512);
    string msg = dr.ReadString(dr.UnconsumedBufferLength);

    string[] lines = msg.Split(new string[]{"\n"}, StringSplitOptions.RemoveEmptyEntries);
    foreach(string line in lines)
    {
        string cmd = line.TrimEnd('\r');

        if (cmd.StartsWith("PING "))
        {
            ping_count++;

            string[] tokens = cmd.Split(' ');

            // Create response
            string response = "PONG " + tokens[1];
            bytes = enc.GetBytes(response);

            dw.WriteBytes(bytes);
            dw.StoreAsync();
            dw.FlushAsync();
        }
    }
}
4

0 に答える 0