使用典型的IRC客户端,我可以输入:
/server localhost 6667 nick:pass
当我进入缺口:通过我配置用于ZNC,(一个IRC摇椅)我转发到ZNC下我的服务器/切口被连接到服务器的:通过组合。
我如何编程方式打开所有的同时,这些参数的Winsock连接? /server localhost 6667 nick:pass
我试过,但连接ZNC似乎被忽略的请求后发送数据。 或者,我只是没有连接到它。 此代码连接不需要认证坪的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);
请参见下面的蟒蛇说明:
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);
一个IRC服务器实现了互联网中继聊天协议。
该协议没有任何共同之处就在你的IRC客户端输入的命令。 因为你不尊重IRC协议,服务器不明白你在说什么,所以充其量不理你,或者只是断开连接。
:该协议在一组4个RFC中定义RFC2810 , RFC2811 , RFC2812和RFC2813 。
你应该阅读这些文件,了解IRC体系结构和网络协议,努力实现将与IRC服务器交互的任何程序之前。
此外,你会很容易找到一些它实现了协议你的资料库。