如何连接到IRC服务器/解析IRC的MSG /乒乓C语言处理(代码提供)(How to connec

2019-07-29 07:28发布

我用C写郎IRC客户端。 并且在连接到serwer遇到了一些问题。 我碰到下面当我运行程序:

OUTPUT

Set Fully Qualified host Domain Name(human readable):  ::automaticaly provided::

Set the port number of the server You want to connect to: ::automaticaly provided::

Destination server IP: 88.190.23.245

Socket descriptor: 3

Connection has been successfully established

Peer's IP is: 88.190.23.245
Peer's port is: 5190

:irc2.gbatemp.net NOTICE AUTH :*** Looking up your hostname...

:irc2.gbatemp.net NOTICE AUTH :*** Found your hostname (cached)

Type Your nick name: ::automaticaly provided::

Type Your user name: ::automaticaly provided::

(10-20 seconds break here and than what follows down here)


ERROR :Closing Link: thisIsMyNickNameXXXa[85.221.165.54] (Ping timeout)

temp.net NOTICE AUTH :*** Found your hostname (cached)

ERROR :Closing Link: thisIsMyNickNameXXXa[85.221.165.54] (Ping timeout)

temp.net NOTICE AUTH :*** Found your hostname (cached)

ERROR :Closing Link: thisIsMyNickNameXXXa[85.221.165.54] (Ping timeout)

temp.net NOTICE AUTH :*** Found your hostname (cached)

.......
.............
...................

================================================== ===========

::automaticaly provided:: -由一个程序现已通过手段,所以我不必须键入了很多次。

顺便说一句。 我连接到irc.gbatemp.net:5190(就我而言无需密码)

提供必要的数据10-20秒断裂发生后(i的输出部分指定)和比ERROR temp.net部分如下循环往复(ⅰ用点标记的话)

所以,问题的主要部分是如何以及何时我应该在respons发送PONG消息PING? 我做我的研究,但仍然无法做到这一点。 为什么我看不到在STDOUT PING消息?

我提供负责输出和PINGPONG部分波纹管(评论)的代码(主要的问题,现在是乒乓的错误状态Ping超时)propably而(1)循环是不完美的,但我想它的另一个话题s对象)代码波纹管:

    int readReady=0;
    int writeReady=0;
    pid_t pID;
    char buf[1024];     //I/O buffer (?)
    pid_t sID;
    char *NICK = "NICK thisIsMyNickNameXXXa\n\r";
    char *USER = "USER tomaazrxtc 8 * :nameandsurname";
    char ping[512];
    char *change;

    pID=fork();
            if(pID < 0){
                //failed to execute fork()
                perror("Error while forking");
                getchar();getchar();
                exit(1);
            }
            if(pID > 0){
                exit(0);
                }
            //child down here
                //setting new session
                sID = setsid();
                if(sID < 0){
                    perror("Error while setting new session");
                    getchar();getchar();
                    exit(1);
                }

//---------receiving NOTICE AUTH :*** part-------------------------------

                if(recv(sockfd, buf, 1024,0)>0){
                printf(buf);
                }
                else{
                    perror("Error while receiving data");
                }

//---------providing and sending NICK and USERNAME-----------------------

                printf("Type Your nick name: \n");
                //scanf(nickname); pamietaj zeby zapewnic podawanie tylko nicku, a format handler zrobic osobno

                send(sockfd, NICK, strlen(NICK), 0);

                printf("Type Your user name: \n");
                //scanf(username); pamietaj zeby zapewnic podawanie tylko nicku, a format handler zrobic osobno

                send(sockfd, USER, strlen(USER), 0);

//--------Shoudnt I receive PING message just here ?????-----------------

                recv(sockfd, buf, strlen(buf), 0);
                printf(buf);

//--------PONG'ing function which I havent tested yet since i cant see PING message----

                recv(sockfd, ping, 512,0);
                if(strstr(ping, "PING")){
                    change = strstr(ping, "PING");
                    strncpy(change, "PONG", 4);
                    send(sockfd, ping, 512, 0);
                    }

//-------------------------------------------------------------------------


                while(1){
                    //sleep(1);
                    if((readReady = readReadiness(sockfd))==0){    //nothing to recv
                        if((writeReady = writeReadiness(sockfd))>0){  //sending is possible
                                scanf(buf);
                                send(sockfd, buf, strlen(buf), 0);
                                continue;
                        }
                        else
                            continue; //if there s no data to read and cant send (is it even possible?)
                    }
                    else{ //if there s some data to recv() on the socket buffer
                        recv(sockfd, buf, strlen(buf), 0);
                        printf(buf);
                        continue;
                    }
                }
//--------------------------------------------------------------------------

好。 我将离开别人的问题在未来提供答案。 这是繁琐。

我刚添加\ n \ r在USER变量的末尾(就像在NICK字符串)。 连接就像一个魅力!

最后 : ))

Answer 1:

所以,我当场就几个问题:

  1. NICK没有正确终止。 它应该是\r\n
  2. USER完全不终止,它应该结束\r\n
  3. 当你把你的Ping响应,你有一个硬编码大小512send()对字符串不起作用,它适用于原始数据。 所以,你会来很多垃圾路过这里。 你需要根据你收到什么传递长度。
  4. printf(buf); 是不是安全。 恰好包含格式说明符的任何输入的字符串会导致printf()尝试,并解释它们(这被称为“格式化字符串漏洞”)。 他们应该被替换printf("%s", buf); 实现以安全的方式相同的行为。
  5. 一般来说你的代码假定从IRC接收的消息是空终止。 他们不是。 您应该使用的返回值recv()知道你有多少数据接收。
  6. 您正在使用strlen()以确定您的缓冲区的大小。 此函数计算一个字符串的长度,而不是你的缓冲区的大小。 你应该使用sizeof操作符来代替。
  7. 我不知道什么样scanf(buf); 是应该做的,但它几乎肯定不是你想要的。 也许你正在寻找fgets()
  8. recv()调用为平的一个之后发生的buf 。 你怎么知道这会发生,当多久,他们会是什么? 好像你应该总是用相同的缓冲工作。


文章来源: How to connect to IRC server/ parse IRC MSGs / PING-PONG handling in C language (code provided)
标签: c sockets ping irc