IRC 通讯细节

Posted

技术标签:

【中文标题】IRC 通讯细节【英文标题】:IRC Communication Details 【发布时间】:2012-09-25 12:29:04 【问题描述】:

最近我读了一些关于 C 中 Socket 编程的基础知识,为了练习这些基础知识,我尝试编写一个程序,它应该在用户和 IRC 服务器之间进行一点对话。

以下是相关代码:

初始化通信套接字:

void init(char *s[])

    struct sockaddr_in server;
    printf("%s : connect . . .\n",s[0]);
    server.sin_family = AF_INET;
    inet_pton(AF_INET,s[1],&server.sin_addr.s_addr);
    server.sin_port = htons(atoi(s[2]));
    if((sock = socket(AF_INET,SOCK_STREAM,0))!= 0)
        printf("%s : socket succesfully initialized.\n",s[0]);
    if(connect(sock,(struct sockaddr *)&server,sizeof(server))==0)
        printf("%s : succesfully connected.\n",s[0]);

发送消息:

void putmessage(char *s)

    write(sock,s,sizeof(s));


/*--------*/
(...)
    do
    
        scanf("%s",input);
        putmessage(strcat(input,"\r\n"));
    while(strcmp(input,"quit"));
(...)

接收消息:

char *getmessage(void)

    int i,t = 0;
    char *p1,*p2;
    p1 = malloc(sizeof(*p1));
    *p1 = '\0';
    p2 = malloc(sizeof(*p2));
    *p2 = '\0';
    do
    
         i = read(sock,buf,BUFSIZE-1);
         buf[i] = '\0';
         t += i+1;
         p2 = malloc(t);
         strcpy(p2,p1);
         strcat(p2,buf);
         free(p1);
         p1 = p2;
    while(i == BUFSIZE-1);
    return p1;

在fork进程以使用一个用于接收和一个用于发送之后被无限调用。 通信基本正常,因为我从我尝试过的不同 irc 服务器(irc.quakenet.org,irc.debain.org/com)收到的消息总是与我发送的消息相关的错误消息,说我错过了参数。

现在我的问题是:为什么我可以通过 telnet 客户端正确连接到那些 irc 网络,但不能使用我自己的代码使用相同的消息(PASS、NICK、USER)。什么对我来说可能很重要,比如编码(gcc 通常使用什么编码?)?

该程序在 Ubuntu 12.04 下运行。如果您需要更多信息,请询问。

【问题讨论】:

向您报告的“缺少参数”错误肯定应该告诉您缺少什么?其他参考 IRC 协议,它应该告诉你如何构造你的消息... 我阅读了两个相关的 RFC,我的消息在我自己的代码和我用于测试的 telnet 客户端上完全相同。在 telnet 客户端上它可以工作,而在我自己的代码上却没有,因此我得出的结论是问题出在连接上,而不是所用消息的形式 【参考方案1】:

由于您尝试在套接字文件描述符上写入的方式,您的客户端并未发送输入的全部消息。

void putmessage(char *s)

    write(sock,s,sizeof(s));

运算符sizeof 不是您在这种情况下想要使用的,因为您将发送sizeof(char*) 字节,即指针的大小。

您应该改用strlen(s) 之类的东西。

【讨论】:

以上是关于IRC 通讯细节的主要内容,如果未能解决你的问题,请参考以下文章

2.6.5版本的dubbo版本号和RPC通讯版本号变更的细节问题

iOS - CNContactStoreDidChangeNotification 通知细节差异

iOS 即时通讯,从入门到 “放弃”?

dubbo开发者指南

优化技术专题「线程间的高性能消息框架」再次细节领略Disruptor的底层原理和优势分析

优化技术专题「线程间的高性能消息框架」再次细节领略Disruptor的底层原理和优势分析