server.c
上传用户:ai20ln
上传日期:2007-01-05
资源大小:79k
文件大小:8k
源码类别:

ICQ/即时通讯

开发平台:

Unix_Linux

  1. #include "micq.h"
  2. #include "datatype.h"
  3. #include "msg_queue.h"
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #ifdef _WIN32
  7. #include <conio.h>
  8. #include <io.h>
  9. #include <winsock2.h>
  10. #include <time.h>
  11. #else
  12. #include <unistd.h>
  13. #include <netinet/in.h>
  14. #include <sys/types.h>
  15. #include <sys/stat.h>
  16. #include <sys/socket.h>
  17. #include <arpa/inet.h>
  18. #include <netdb.h>
  19. #include <sys/time.h>
  20. #include <sys/wait.h>
  21. #endif
  22. #include <fcntl.h>
  23. #include <time.h>
  24. #include <stdarg.h>
  25. #include <string.h>
  26. #include <ctype.h>
  27. #include <assert.h>
  28. #include <limits.h>
  29. /*extern unsigned int next_resend;*/
  30. extern BOOL serv_mess[ 1024 ]; /* used so that we don't get duplicate messages with the same SEQ */
  31. static void Multi_Packet( SOK_T sok, BYTE *data )
  32. {
  33.    int num_pack, i;
  34.    int len;
  35.    BYTE * j;
  36.    srv_net_icq_pak pak;
  37.    num_pack = (unsigned char) data[0];
  38.    j = data;
  39.    j++;
  40.    
  41.    for ( i=0; i < num_pack; i++ )
  42.    {
  43.        len = Chars_2_Word( j );
  44.        pak = *( srv_net_icq_pak *) j ;
  45.        j += 2;
  46. #if 0
  47.        M_print( "nPacket Number %dn", i );
  48.        M_print( "Length %04Xn", len );
  49.        M_print( "Command %04Xn", Chars_2_Word( pak.head.cmd ) );
  50.        M_print( "SEQ %04Xn", Chars_2_Word( pak.head.seq ) );
  51.        M_print( "Ver %04Xn", Chars_2_Word( pak.head.ver ) );
  52. #endif
  53.        Server_Response( sok, pak.data, (len+2) - sizeof( pak.head ), Chars_2_Word( pak.head.cmd ),
  54.                  Chars_2_Word( pak.head.ver ), Chars_2_Word( pak.head.seq )
  55.                  , Chars_2_Word( pak.head.UIN ) );
  56.        j += len;
  57.    }
  58. }
  59. void Server_Response( SOK_T sok, BYTE *data, DWORD len, WORD cmd, WORD ver, WORD seq, DWORD uin )
  60. {
  61.    SIMPLE_MESSAGE_PTR s_mesg;
  62.    char *temp;
  63.    int i;
  64.    
  65.    switch ( cmd )
  66.    {
  67.    case SRV_ACK:
  68.       if ( Verbose > 1 )
  69.       {
  70.          M_print( "nThe server acknowledged the %04x command.n", 
  71.             last_cmd[ seq  ] );
  72.          M_print( "The SEQ was %04Xn", seq );
  73.       }
  74.       Check_Queue( seq );
  75.       if ( Verbose ) {
  76.  if ( len != 0 )
  77.  {
  78.     M_print( "Extra Data %dn", len );
  79.     Hex_Dump( data, len );
  80.             Prompt();
  81.  }
  82.       }
  83.       break;
  84.    case SRV_MULTI_PACKET:
  85. /*      printf( "n" );
  86.       Hex_Dump( data, len );*/
  87.       Multi_Packet( sok, data );
  88.       break;
  89.    case SRV_NEW_UIN:
  90.       M_print( "nThe new UIN is %ld!n", uin );
  91.       Prompt();
  92.       break;
  93.    case SRV_UPDATE_FAIL:
  94.       M_print( "nFailed to update info.n" );
  95.       Prompt();
  96.       break;
  97.    case SRV_UPDATE_SUCCESS:
  98.       M_print( "nUser info successfully updated.n" );
  99.       Prompt();
  100.       break;      
  101.    case SRV_LOGIN_REPLY:
  102. /*      UIN = Chars_2_DW( &pak.data[0] ); */
  103.       our_ip = Chars_2_DW( &data[0] );
  104.       M_print( "nLogin successful! UIN : %lun", uin );
  105. #if ICQ_VER == 0x0002
  106.       M_print( " IP : %u.%u.%u.%ut", data[4], data[5], data[6], data[7] );
  107. #else
  108.       M_print( " IP : %u.%u.%u.%ut", data[0], data[1], data[2], data[3] );
  109. #endif
  110.       Time_Stamp();
  111.       M_print( "n" );
  112.       snd_login_1( sok );
  113.       snd_contact_list( sok );
  114.       snd_invis_list( sok );
  115.       snd_vis_list( sok );
  116. /*      icq_change_status( sok, set_status );*/
  117.       Prompt();
  118.       break;
  119.    case SRV_RECV_MESSAGE:
  120.          Recv_Message( sok, data );
  121.       Prompt();
  122.       break;
  123.    case SRV_X1: /* unknown message  sent after login*/
  124.       if ( Verbose )
  125.          M_print( "nAcknowleged SRV_X1 0x021C Done Contact list?n" );
  126.       Show_Quick_Status();
  127.       Done_Login = TRUE;
  128.       Prompt();
  129.       break;
  130.    case SRV_X2: /* unknown message  sent after login*/
  131.       if ( Verbose ) {
  132.          M_print( "nAcknowleged SRV_X2 0x00E6 Done old messages?n" );
  133.          Prompt();
  134.       }
  135.       snd_got_messages( sok );
  136.       break;
  137.    case SRV_INFO_REPLY:
  138.       Display_Info_Reply( sok, data );
  139.       Prompt();
  140.       break;
  141.    case SRV_EXT_INFO_REPLY:
  142.       Display_Ext_Info_Reply( sok, data );
  143.       Prompt();
  144.       break;
  145.    case SRV_USER_OFFLINE:
  146.       User_Offline( sok, data );
  147.       Prompt();
  148.       break;
  149.    case SRV_BAD_PASS:
  150.       M_print( MESSCOL "nYou entered an incorrect password." NOCOL "n" );
  151.       exit( 1 );
  152.       break;
  153.    case SRV_TRY_AGAIN:
  154.       M_print( MESSCOL "nServer is busy please try again.nTrying again...n");
  155.       Prompt();
  156. #ifdef UNIX
  157.       if ( fork() == 0 )
  158.       {
  159.          sleep( 5 );
  160.          Login( sok, UIN, &passwd[0], our_ip, our_port, set_status );
  161.          exit( 0 );
  162.       }
  163. #else
  164.       Login( sok, UIN, &passwd[0], our_ip, our_port, set_status );
  165. #endif
  166.       for ( i = 0; i< 1024; i++ )
  167.       {
  168.          serv_mess[ i ]=FALSE;
  169.       }
  170.      break;
  171.    case SRV_USER_ONLINE:
  172.       User_Online( sok, data );
  173.       Prompt();
  174.       break;
  175.    case SRV_STATUS_UPDATE:
  176.       Status_Update( sok, data );
  177.       Prompt();
  178.       break;
  179.    case SRV_GO_AWAY:
  180.    case SRV_NOT_CONNECTED:
  181.       #ifdef FUNNY_MSGS 
  182.       M_print( "nServer sent "Go away!!" command.t" );
  183.       #else
  184.       M_print( "nServer has forced us to disconnect.  This may be because of network lag.t" );
  185.       #endif
  186.       Time_Stamp();
  187.       Quit = TRUE;
  188.       Prompt();
  189.       break;
  190.    case SRV_END_OF_SEARCH:
  191.       M_print( "nSearch done." );
  192.       if ( len >= 1 ) {
  193.          if (  data[0] == 1 ) {
  194.             M_print( "tToo many users found.n" );
  195.  } else {
  196.             M_print( "tAll users found.n" );
  197.  }
  198.       } else {
  199.          M_print( "n" );
  200.       }
  201.       Prompt();
  202.       break;
  203.    case SRV_USER_FOUND:
  204.       Display_Search_Reply( sok, data );
  205.       Prompt();
  206.       break;
  207.    case SRV_RAND_USER:
  208.       Display_Rand_User( sok, data, len );
  209.       Prompt();
  210.       break;
  211.    case SRV_SYS_DELIVERED_MESS:
  212.       M_print( "n" );
  213.       s_mesg = ( SIMPLE_MESSAGE_PTR ) data;
  214.       last_recv_uin = Chars_2_DW( s_mesg->uin );
  215.       Print_UIN_Name( Chars_2_DW( s_mesg->uin  ) );
  216.       if ( 0 == ( Chars_2_Word( s_mesg->type ) & MASS_MESS_MASK ) )
  217.          M_print( " - Instant Messagea " );
  218.       else
  219.          M_print( " - Instant Mass Messagea " );
  220.       if ( Verbose )
  221.          M_print( " Type = %04xt", Chars_2_Word( s_mesg->type ) );
  222.       Time_Stamp();
  223.       Do_Msg( sok, Chars_2_Word( s_mesg->type ), Chars_2_Word( s_mesg->len ), 
  224.            s_mesg->len + 2,last_recv_uin); 
  225.       if ( 0xfe != *( ((unsigned char *) s_mesg ) + sizeof( s_mesg ) ) )
  226.       {
  227.          if ( auto_resp &&
  228.     (Current_Status != STATUS_ONLINE) &&
  229.     (Current_Status != STATUS_FREE_CHAT)  )
  230.          {
  231.     switch ( Current_Status & 0x1ff )
  232.     {
  233.     case STATUS_OCCUPIED:
  234.        /* Dup the string so the russian translation only happens once */
  235.        temp = strdup( auto_rep_str_occ );
  236.        icq_sendmsg( sok, Chars_2_DW( s_mesg->uin ), temp, NORM_MESS );
  237.        break;
  238.     case STATUS_AWAY:
  239.        temp = strdup( auto_rep_str_away );
  240.        icq_sendmsg( sok, Chars_2_DW( s_mesg->uin ), temp, NORM_MESS );
  241.        break;
  242.     case STATUS_DND:
  243.        temp = strdup( auto_rep_str_dnd );
  244.        icq_sendmsg( sok, Chars_2_DW( s_mesg->uin ), temp, NORM_MESS );
  245.        break;
  246.     case STATUS_INVISIBLE:
  247.        temp = strdup( auto_rep_str_inv );
  248.        icq_sendmsg( sok, Chars_2_DW( s_mesg->uin ), temp, NORM_MESS );
  249.        break;
  250.     case STATUS_NA:
  251.        temp = strdup( auto_rep_str_na );
  252.        icq_sendmsg( sok, Chars_2_DW( s_mesg->uin ), temp, NORM_MESS );
  253.        break;
  254.     default:
  255.        temp = strdup( auto_rep_str_occ );
  256.        M_print("You have encounterd a bug in my code :( I now own you a beer!nGreetings Fryslan!n");
  257.             }
  258.  free( temp );
  259.  M_print( "[ Sent auto-reply message ]n" );
  260.  log_event("Sending an auto-reply message to ","",last_recv_uin);
  261.  }
  262.       }
  263.       Prompt();
  264.       break;
  265.    case SRV_AUTH_UPDATE:
  266.        break;
  267.    default: /* commands we dont handle yet */
  268.        M_print( CLIENTCOL "nThe response was %04Xt", cmd );
  269.        M_print( "The version was %Xt", ver  );
  270.        Time_Stamp();
  271.        M_print( "nThe SEQ was %04Xt", seq  );
  272.        M_print( "The size was %dn", len );
  273.        if ( Verbose )
  274.        {
  275.             if ( len > 0 )
  276.                 Hex_Dump( data, len );
  277.        }
  278.        M_print( NOCOL "n" );
  279.        Prompt();
  280.        break;
  281.    }
  282. }