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

使用典型的irc客户端我可以输入:

/server localhost 6667 nick:pass 

当我输入缺口:通过我配置为ZNC,(一个IRC保镖)我转发到znc连接到我的服务器/ nick:pass组合下的服务器。

如何以编程方式同时打开所有这些参数的winsock连接? /server localhost 6667 nick:pass

我尝试在连接后发送数据,但znc似乎忽略了请求。 或者我根本就没有连接到它。 此代码已连接到不需要Ping身份validation的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); 

请参阅下面的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进行身份validation。 基本上,在另一种语言中,我向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客户端与代码连接到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); 

IRC服务器实现Internet中继聊天协议。

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

该协议在一组4个RFC中定义: RFC2810 , RFC2811 , RFC2812和RFC2813 。

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

此外,您将很容易找到一些为您实现协议的库。