Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winsock-为什么不是';t ZNC(和IRC保镖)接受我的winsock连接?_C_Winsock_Irc - Fatal编程技术网

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

Winsock-为什么不是';t ZNC(和IRC保镖)接受我的winsock连接?,c,winsock,irc,C,Winsock,Irc,使用典型的irc客户端,我可以键入: /server localhost 6667 nick:pass 当我输入我为ZNC配置的nick:pass(一个IRC保镖)时,我将被转发到ZNC连接到的服务器,该服务器位于我的server/nick:pass组合下 如何以编程方式同时使用所有这些参数打开winsock连接/server localhost 6667 nick:pass 我尝试在连接后发送数据,但znc似乎忽略了请求。或者我根本就没有连接到它。此代码已连接到不需要Ping身份验证的IRC

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

/server localhost 6667 nick:pass
当我输入我为ZNC配置的nick:pass(一个IRC保镖)时,我将被转发到ZNC连接到的服务器,该服务器位于我的server/nick:pass组合下

如何以编程方式同时使用所有这些参数打开winsock连接<代码>/server localhost 6667 nick:pass

我尝试在连接后发送数据,但znc似乎忽略了请求。或者我根本就没有连接到它。此代码已连接到不需要Ping身份验证的IRC服务器,因此我知道它可以工作

#定义AF#u INET 2
#定义SOCK_流1
#定义SOL_套接字0xffff
#定义SO_SNDTIMEO 0x1005
字符串服务器\u addr=“127.0.0.1”;
int server_port=6667;
void ircconnect(){
int struct_sockaddr[4];
内部地址,端口低,端口高;
int-opts[1];
INTC;
如果(irc_disabled==1)返回(0);
//填充sockaddr结构
addr=inet\u addr(服务器地址);
端口\低=服务器\端口&0x00ff;
端口\u高=(服务器\u端口&0xff00)>>8;

struct_sockaddr[0]=AF_INET |(port_high使用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);

请参见下面的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);
}

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

该协议与您在IRC客户端中键入的命令没有任何共同之处。由于您不遵守IRC协议,服务器无法理解您所说的内容,因此最多会忽略您,或者干脆断开连接

协议在一组4个RFC中定义:,和

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


此外,您还可以轻松找到一些为您实现协议的库。

非常感谢:)我正在使用wireshark,我必须仔细看看。:)我会尝试你的建议1.不要在文件中定义你的
\define
s。相反,
\define应该包含相应的头文件。2.不要再手动设置
AF\u INET
。现在是2012年,该使用了。好的。谢谢你的建议。我会的。我非常感谢你的帮助,但是通过反复试验,我发现代码缺少这些转义字符:
“\r\n”
。我现在用它来发布我的交易。我确信它可以改进,但它做了我需要它做的事情。下面我的回答中有一个解释。
#!/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')