LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 816|回复: 5

irc 的C 代码有问题,有朋友了解吗?

[复制链接]
发表于 2004-8-18 23:58:42 | 显示全部楼层 |阅读模式

  1. #include <sys/stat.h>
  2. #include <fcntl.h>
  3. #include <sys/types.h>
  4. #include <sys/socket.h>
  5. #include <netinet/in.h>
  6. #include <arpa/inet.h>
  7. #include <unistd.h>

  8. #define PORT 6667
  9. //#define SERVER_IP "202.109.72.72"
  10. #define SERVER_IP "211.92.88.40"

  11. main()
  12. {
  13.   int s;
  14.   struct sockaddr_in addr;
  15.   char buffer[256];
  16.   if((s = socket(AF_INET,SOCK_STREAM, 0)) <0 )
  17.   {
  18.     perror("socket");
  19.     exit(1);
  20.   }
  21.   //填写sockaddr_in 结构
  22.   bzero(&addr, sizeof(addr));
  23.   addr.sin_family = AF_INET;
  24.   addr.sin_port = htons(PORT);
  25.   addr.sin_addr.s_addr = inet_addr(SERVER_IP);
  26.   //尝试连接
  27.   if(connect(s, &addr, sizeof(addr)) <0 )
  28.   {
  29.     perror("connect");
  30.     exit(1);
  31.   }
  32.   recv(s, buffer, sizeof(buffer), 0);
  33.   printf("%s\n",buffer);
  34.   while(1)
  35.   {
  36.     bzero(buffer,sizeof(buffer));
  37.     read(STDIN_FILENO,buffer, sizeof(buffer));
  38.     if(send(s, buffer, sizeof(buffer),0) <0 )
  39.     {
  40.       perror("send");
  41.       exit(1);
  42.     }
  43.     recv(s, buffer, sizeof(buffer), 0);
  44.     printf("%s\n",buffer);
  45.   }
  46. }

复制代码
发表于 2004-8-19 18:06:14 | 显示全部楼层
有什么问题?
 楼主| 发表于 2004-8-21 10:27:06 | 显示全部楼层
我不清楚要经历那此步骤才能连上 irc 服务器。
我这里有了二步,第一步收到后,进入 while(1)发些信息,再收一些信息,这样不断循环。可是程序只进行了如下就死循环了。
编译: gcc -o pirc.elf programname.c
===============

$ ./pirc.elf
NOTICE AUTH :*** Looking up your hostname... (收到的第一条信息)
(可以发信息,回车)

NOTICE AUTH :*** Couldn't look up your hostname (收到的第二条)
(进入死循环,无反应)

(Ctrl - C 退出)
发表于 2004-8-21 22:33:34 | 显示全部楼层
什么叫连上啊?如果是指简单的和服务器建立连接,那你的程序已经做到了(要不也不会收到服务器消息);如果指的是要正常和服务器交互,那就要看IRC的协议了。原始的协议应该是RFC1459定义的,不过似乎后来又有加了新的。google一把吧。不知道协议不可能写出来的。
 楼主| 发表于 2004-8-22 13:01:56 | 显示全部楼层
嗯,看来是我没有看来协议,要再好好看看
发表于 2004-8-23 11:42:32 | 显示全部楼层

---the code probem to be fixed

#include <sys/stat.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>

#define PORT 6667
//#define SERVER_IP "202.109.72.72"
#define SERVER_IP "211.92.88.40"

main()
{
  int s;
  struct sockaddr_in addr;
  char buffer[256];
  if((s = socket(AF_INET,SOCK_STREAM, 0)) <0 )
  {
    perror("socket");
    exit(1);
  }
  //填写sockaddr_in 结构
  bzero(&addr, sizeof(addr));
  addr.sin_family = AF_INET;
  addr.sin_port = htons(PORT);
  addr.sin_addr.s_addr = inet_addr(SERVER_IP);
  //尝试连接
  if(connect(s, &addr, sizeof(addr)) <0 )
  {
    perror("connect");
    exit(1);
  }
  recv(s, buffer, sizeof(buffer), 0);
added:
  buffer[256]='\0';

  printf("%s\n",buffer);
  while(1)
  {
    bzero(buffer,sizeof(buffer));
    read(STDIN_FILENO,buffer, sizeof(buffer));
    if(send(s, buffer, sizeof(buffer),0) <0 )
    {
      perror("send");
      exit(1);
    }
    recv(s, buffer, sizeof(buffer), 0);
added:
    buffer[256]='\0';

    printf("%s\n",buffer);
   
  }
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表