0

典型的な irc クライアントを使用して、次のように入力できます。

/server localhost 6667 nick:pass

ZNC (IRC バウンサー) 用に構成した nick:pass を入力すると、サーバー/ニックネーム:パスの組み合わせで znc が接続されているサーバーに転送されます。

これらすべての引数を同時にプログラムで winsock 接続を開くにはどうすればよいですか?/server localhost 6667 nick:pass

接続後にデータを送信しようとしましたが、znc は要求を無視しているようです。または、まったく接続していません。このコードは、Ping 認証を必要としない IRC サーバーに接続しているので、動作することがわかります。

#define AF_INET                    2
#define SOCK_STREAM                1
#define SOL_SOCKET                 0xffff
#define SO_SNDTIMEO                0x1005

string server_addr = "127.0.0.1";
int server_port = 6667;

void ircconnect(){
int struct_sockaddr[4];
int addr, port_low, port_high;
int opts[1];
int c;

if (irc_disabled == 1) return(0);

// fill the sockaddr struct
addr = inet_addr(server_addr);
port_low = server_port & 0x00ff;
port_high = (server_port & 0xff00) >> 8; 
struct_sockaddr[0] = AF_INET | (port_high << 16) | (port_low << 24);
struct_sockaddr[1] = addr;
struct_sockaddr[2] = 0;
struct_sockaddr[3] = 0;

// connect
s = socket(AF_INET, SOCK_STREAM, 0);

opts[0] = 1000; // send timeout milliseconds
setsockopt(s, SOL_SOCKET, SO_SNDTIMEO, opts, 4);
c = connect(s, struct_sockaddr, 16);

Sleep(5000);

sendLine(nick + ":" + password);
4

3 に答える 3

1

以下のPythonの説明を参照してください。

int struct_sockaddr[4];
int addr, port_low, port_high;
int opts[1];
int c;
string zncauth = nick + ":" + password;

if (irc_disabled == 1) return(0);

// fill the sockaddr struct
addr = inet_addr(server_addr);
port_low = server_port & 0x00ff;
port_high = (server_port & 0xff00) >> 8; 
struct_sockaddr[0] = AF_INET | (port_high << 16) | (port_low << 24);
struct_sockaddr[1] = addr;
struct_sockaddr[2] = 0;
struct_sockaddr[3] = 0;

// connect
s = socket(AF_INET, SOCK_STREAM, 0);
opts[0] = 1000; // send timeout milliseconds
setsockopt(s, SOL_SOCKET, SO_SNDTIMEO, opts, 4);
c = connect(s, struct_sockaddr, 16);

// send
sendLine("NICK zncbotnick");
sendLine("USER znc bot znc :znc");
sendLine("PASS " + zncauth);

void sendLine(string text){
    if (irc_disabled == 1) return(0);
    text = text + "\r\n";
    send(s, text, StringLen(text), 0);
}

上記のコードは最終的に機能し、これはPythonでZNCで認証するために機能します。基本的に、他の言語では、コマンドをzncにスローしていましたが、コードに戻り文字と改行文字がないため、コマンドがzncに到達することはありませんでした'\r\n'。Pythonを使用すると、問題をリアルタイムで診断することができました。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

//Test.py
import socket

zncauth = 'nick:password'
server_addr = '127.0.0.1'
server_port = 6667
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((server_addr, server_port))   
s.send( 'NICK botnick\r\n')
s.send( 'USER znc bot znc :znc\r\n')
s.send( 'PASS ' + zncauth + ' \r\n')
于 2012-05-01T18:25:37.443 に答える
0

Wireshark のようなパケット スニファーを使用して、IRC クライアントとコードを使用して ZNC に接続するときのソケット トラフィックを表示し、送信されるコマンドの違いを探します。

そうは言っても、コードにもいくつかの奇妙な点があります。代わりにこれを試してください:

#define AF_INET                    2
#define SOCK_STREAM                1
#define SOL_SOCKET                 0xffff
#define SO_SNDTIMEO                0x1005

string server_addr = "127.0.0.1";
u_short server_port = 6667;

void ircconnect(){
    struct sockaddr_in addr;
    int opts;
    int c;

    if (irc_disabled == 1) return(0);

    // fill the sockaddr struct
    memset(&addr, 0, sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_port = htons(server_port);
    addr.sin_addr.s_addr = inet_addr(server_addr.c_str());

    // connect
    s = socket(AF_INET, SOCK_STREAM, 0);

    opts = 1000; // send timeout milliseconds
    setsockopt(s, SOL_SOCKET, SO_SNDTIMEO, (char *)&opts, sizeof(opts));
    c = connect(s, (struct sockaddr *)&addr, sizeof(addr));

    Sleep(5000);

    sendLine(nick + ":" + password);
于 2012-04-27T02:27:50.663 に答える
0

IRC サーバーは、インターネット リレー チャット プロトコルを実装します。

このプロトコルは、IRC クライアントで入力するコマンドと共通点はありません。IRC プロトコルを尊重しないため、サーバーはあなたの言っていることを理解できず、せいぜいあなたを無視するか、接続を切断するだけです。

プロトコルはRFC2810RFC2811RFC2812、およびRFC2813の 4 つの RFC のセットで定義されています。

IRC サーバーと対話するプログラムを実装する前に、これらのドキュメントを読み、IRC アーキテクチャとプロトコルを理解する必要があります。

さらに、プロトコルを実装するライブラリを簡単に見つけることができます。

于 2012-05-01T19:06:35.070 に答える