Winsock - 为什么ZNC(和IRC保镖)不接受我的winsock连接?

问题描述:

使用典型的IRC客户端我可以输入:Winsock - 为什么ZNC(和IRC保镖)不接受我的winsock连接?

/server localhost 6667 nick:pass 

当我进入缺口:通过我配置用于ZNC,(一个IRC摇椅)我转发到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); 
+1

1.不要在文件中定义'#define's。相反,'#include'适当的头文件。 2.不要再手动设置AF_INET。这是2012年,该使用['getaddrinfo()'](http://pubs.opengroup.org/onlinepubs/009604499/functions/getaddrinfo.html)。 – glglgl 2012-04-27 06:40:50

+0

好的。感谢您的建议。我会。 – user1337878 2012-04-27 12:26:09

请参见下面的蟒蛇说明:

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') 

使用数据包嗅探器像Wireshark的使用IRC客户对你的代码conecting到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); 
+0

非常感谢:)我使用wireshark,我必须仔细观察。 :)我会尝试你的建议 – user1337878 2012-04-27 02:37:10

IRC服务器实现Internet Relay Chat协议。

该协议与您在IRC客户端中键入的命令没有任何共同之处。因为你不尊重IRC协议,所以服务器不理解你在说什么,因此最好忽略你,或者只是断开连接。 RFC2810RFC2811RFC2812RFC2813

该协议在一组4个RFC中定义。

在尝试实现任何与IRC服务器交互的程序之前,您应该阅读这些文档并理解IRC体系结构和协议。

另外,你会很容易找到一些为你实现协议的库。

+1

我非常感谢你的帮助,但通过反复试验,我发现代码中缺少这些转义字符:''\ r \ n“'。我现在用它来发布我的交易。我相信它可以得到改善,但它确实做到了我所需要的。以下是我的回答。 – user1337878 2012-05-01 19:23:47