免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 无风之谷
打印 上一主题 下一主题

[WebLogic] 中间件WebLogic/Tuxedo/GoldenGate的排错与优化(获奖名单已公布) [复制链接]

论坛徽章:
0
91 [报告]
发表于 2012-05-15 09:02 |只看该作者
很好奇,不知道大名鼎鼎的Tuxedo源代码长什么样子?

论坛徽章:
0
92 [报告]
发表于 2012-05-16 09:01 |只看该作者
也很好奇,那WebLogic的源代码呢?

论坛徽章:
0
93 [报告]
发表于 2012-05-18 06:50 |只看该作者
本帖最后由 三人行必有吾师 于 2012-05-18 21:16 编辑

关于源代码这类的问题,现在看起来,感觉其实还是比较敏感的,容易越界...

论坛徽章:
0
94 [报告]
发表于 2012-05-18 06:57 |只看该作者
回复 91# time不待人

其实,从安装和使用Tuxedo的过程中,公开的本身就可以拿到一部分源代码。

首先,在编译的时候,带上"-k"选项,就能保留中间生成的临时主函数相关源文件,比如大家熟知的Tuxedo自带的大小写转换的例子,一般写服务端程序时,只能看到封装好的Service接口,但当tmboot时,大家知道它是由BBL带起来的,所以肯定是个标准的C语言程序,只是其主函数main()由Tuxedo自己动态提供了。

比如我们如果在编译simpserv的TOUPPER服务时,使用该选项,就能得到源代码(举例)BS-1554.c
  1. #include <stdio.h>
  2. #include <xa.h>
  3. #include <atmi.h>

  4. #if defined(__cplusplus)
  5. extern "C" {
  6. #endif
  7. extern int _tmrunserver _((int));
  8. extern void TOUPPER _((TPSVCINFO *));
  9. #if defined(__cplusplus)
  10. }
  11. #endif

  12. static struct tmdsptchtbl_t _tmdsptchtbl[] = {
  13.         { (char*)"TOUPPER", (char*)"TOUPPER", (void (*) _((TPSVCINFO *))) TOUPPER, 0, 0 },
  14.         { NULL, NULL, NULL, 0, 0 }
  15. };

  16. #ifndef _TMDLLIMPORT
  17. #define _TMDLLIMPORT
  18. #endif

  19. #if defined(__cplusplus)
  20. extern "C" {
  21. #endif
  22. _TMDLLIMPORT extern struct xa_switch_t tmnull_switch;
  23. #if defined(__cplusplus)
  24. }
  25. #endif

  26. typedef void (*tmp_void_cast)();
  27. typedef void (*tmp_voidvoid_cast)(void);
  28. typedef int (*tmp_intchar_cast)(int, char **);
  29. typedef int (*tmp_int_cast)(int);
  30. struct tmsvrargs_t tmsvrargs = {
  31.         NULL,
  32.         &_tmdsptchtbl[0],
  33.         0,
  34.         (tmp_intchar_cast)tpsvrinit,
  35.         (tmp_voidvoid_cast)tpsvrdone,
  36.         (tmp_int_cast)_tmrunserver,        /* PRIVATE  */
  37.         NULL,                        /* RESERVED */
  38.         NULL,                        /* RESERVED */
  39.         NULL,                        /* RESERVED */
  40.         NULL,                        /* RESERVED */
  41.         (tmp_intchar_cast)tpsvrthrinit,
  42.         (tmp_voidvoid_cast)tpsvrthrdone
  43. };

  44. struct tmsvrargs_t *
  45. #ifdef _TMPROTOTYPES
  46. _tmgetsvrargs(void)
  47. #else
  48. _tmgetsvrargs()
  49. #endif
  50. {
  51.         tmsvrargs.reserved1 = NULL;
  52.         tmsvrargs.reserved2 = NULL;
  53.         tmsvrargs.xa_switch = &tmnull_switch;
  54.         return(&tmsvrargs);
  55. }

  56. int
  57. #ifdef _TMPROTOTYPES
  58. main(int argc, char **argv)
  59. #else
  60. main(argc,argv)
  61. int argc;
  62. char **argv;
  63. #endif
  64. {
  65. #ifdef TMMAINEXIT
  66. #include "mainexit.h"
  67. #endif

  68.         return( _tmstartserver( argc, argv, _tmgetsvrargs()));
  69. }
复制代码

论坛徽章:
0
95 [报告]
发表于 2012-05-18 13:03 |只看该作者
一般来说考虑stucts等架构tomcat就可以了,但如果考虑EJB的话,WebLogic是比较好的选择

论坛徽章:
0
96 [报告]
发表于 2012-05-18 20:16 |只看该作者
本帖最后由 三人行必有吾师 于 2012-05-18 20:33 编辑

回复 95# ???ó???ê

是的,实践中这个评判其实简洁可行,尤其是三大开源框架SSH开发应用流行的话。


   

论坛徽章:
0
97 [报告]
发表于 2012-05-18 20:32 |只看该作者
回复 91# time不待人

其次,在Tuxedo安装之后的lib目录下,一般也自带若干个.c文件,典型的有AUTHSRV.c,tmtypesw.c等;前者是用来写自定义的安全认证接口用,后者做自定义buffer处理,特别是encode/decode相关动作,但实践中反而是经常用来趁机添加数据加密环节。

而且这些源文件,要是从C语言角度来说的,写得相当经典,对C语言理解之深,折射出贝尔实验室当年诞生UNIX/C的风采,比如AUTHSRV.c开头第一个函数:
  1. static        char *
  2. #ifdef _TMPROTOTYPES
  3. mystrtok(char *s, char *del)
  4. #else
  5. mystrtok(s,del)
  6. char        *s;
  7. char        *del;
  8. #endif
  9. {
  10.         static        char *p = NULL;
  11.         char        *r;

  12.         if (s != NULL) {
  13.                 p = s;
  14.         }
  15.         if ((p == NULL) || (*p == '\0')) {
  16.                 return(NULL);
  17.         }
  18.         r = p;
  19.         while (strchr(del,*p) == NULL) {
  20.                 p++;
  21.         }
  22.         if (*p != '\0') {
  23.                 *p++ = '\0';
  24.         }
  25.         return(r);
  26. }
复制代码

论坛徽章:
0
98 [报告]
发表于 2012-05-18 20:54 |只看该作者
本帖最后由 三人行必有吾师 于 2012-05-18 20:56 编辑

回复 91# time不待人

然后,言归正传,看一眼真实的Tuxedo相关源码和工程相关的东西,为了不引起不必要的麻烦,这里只取几个老点的片段示例一下为止:

1. 编译工程的Makefile,比如其中一个tuxedo.mk
  1. #        Copyright 1996 BEA Systems, Inc.
  2. #        THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF
  3. #        BEA Systems, Inc.
  4. #        The copyright notice above does not evidence any
  5. #        actual or intended publication of such source code.

  6. #        Copyright (c) 1984 AT&T
  7. #          All Rights Reserved

  8. #        THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T
  9. #        The copyright notice above does not evidence any
  10. #        actual or intended publication of such source code.

  11. #ident        "@(#) tuxedo/tuxedo.mk        $Revision: 1.1 $"
  12. #

  13. AT=
  14. ARGS=all
  15. MAKE=make
  16. LANG = C
  17. SINCDIR=$(TUXDIR)/sysinclude
  18. INCDIR=$(TUXDIR)/include
  19. LIBDIR=$(TUXDIR)/lib
  20. BINDIR=$(TUXDIR)/bin
  21. XCBINDIR=$(TUXDIR)/bin
  22. CGFLAG=
  23. CC=cc
  24. AR=ar
  25. ARFLAGS=lrv
  26. LORDER=lorder
  27. SUF=.a
  28. DSUF=.a
  29. LIBSUF=.a
  30. PRE=$(LIBDIR)/lib
  31. LINT=lint
  32. LIBNET=-lnsl_s
  33. NETWORK=tli
  34. CRYPT=des

  35. ALL=include libbuft libtux libnet libtmib libqm cmdtux syssrvrs
  36. all:        $(ALL)
  37.         @:
  38. installws:        include libbuft libnet

  39. $(ALL)::
  40.         $(AT) cd $(@);  $(MAKE) -f $(@).mk  \
  41.                 MAKE=$(MAKE) SUF=$(SUF) DSUF=$(DSUF) PRE=$(PRE) \
  42.                 TUXDIR=$(TUXDIR) LANG=$(LANG) LORDER=$(LORDER) \
  43.                 INCDIR=$(INCDIR) SINCDIR=$(SINCDIR) LIBDIR=$(LIBDIR) \
  44.                 BINDIR=$(BINDIR) XCBINDIR=$(XCBINDIR) \
  45.                 PLATFORM=$(PLATFORM) LIBSUF=$(LIBSUF) \
  46.                 LINT="$(LINT)" LIBNET="$(LIBNET)" NETWORK=$(NETWORK) CRYPT=$(CRYPT) \
  47.                 CGFLAG="$(CGFLAG)" CC=$(CC) AR=$(AR) ARFLAGS="$(ARFLAGS)" $(ARGS)

  48. install clean clobber depend lint:
  49.         $(MAKE) -f tuxedo.mk ARGS=$@ \
  50.                 MAKE=$(MAKE) SUF=$(SUF) DSUF=$(DSUF) PRE=$(PRE) \
  51.                 TUXDIR=$(TUXDIR) LANG=$(LANG) LORDER=$(LORDER) \
  52.                 INCDIR=$(INCDIR) SINCDIR=$(SINCDIR) LIBDIR=$(LIBDIR) \
  53.                 BINDIR=$(BINDIR) XCBINDIR=$(XCBINDIR) \
  54.                 PLATFORM=$(PLATFORM) LIBSUF=$(LIBSUF) \
  55.                 LINT="$(LINT)" LIBNET="$(LIBNET)" NETWORK=$(NETWORK) CRYPT=$(CRYPT) \
  56.                 CGFLAG="$(CGFLAG)" CC=$(CC) AR=$(AR) ARFLAGS="$(ARFLAGS)"

  57. list:
  58.         @echo tuxedo/tuxedo.mk
  59.         @$(MAKE) -f tuxedo.mk ARGS=$@

  60. print:
  61.         @echo tuxedo/tuxedo.mk
  62.         @$(MAKE) -f tuxedo.mk ARGS=$@
复制代码
里面至今还清晰的保留了AT&T字样。。。。。
  1. #        Copyright (c) 1984 AT&T
  2. #          All Rights Reserved
复制代码

论坛徽章:
0
99 [报告]
发表于 2012-05-18 20:59 |只看该作者
本帖最后由 三人行必有吾师 于 2012-05-18 21:00 编辑

2. 一些内部的头文件(安装后在Tuxedo的Include目录下看不到的)

比如“tlog.h”:
  1. /*        Copyright (c) 1998 BEA Systems, Inc.
  2.         All rights reserved

  3.         THIS IS UNPUBLISHED PROPRIETARY
  4.         SOURCE CODE OF BEA Systems, Inc.
  5.         The copyright notice above does not
  6.         evidence any actual or intended
  7.         publication of such source code.
  8. */

  9. /*        Copyright 1996 BEA Systems, Inc.        */
  10. /*        THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF             */
  11. /*        BEA Systems, Inc.                             */
  12. /*        The copyright notice above does not evidence any           */
  13. /*        actual or intended publication of such source code.        */

  14. /*      Copyright (c) 1990 Unix System Laboratories, Inc.
  15.         All rights reserved

  16.         THIS IS UNPUBLISHED PROPRIETARY
  17.         SOURCE CODE OF Unix System Laboratories, Inc.
  18.         The copyright notice above does not
  19.         evidence any actual or intended
  20.         publication of such source code.
  21. */
  22. #ifndef TLOG_H
  23. #define TLOG_H
  24. /* #ident        "@(#) tuxedo/include/tlog.h        $Revision: 1.1 $" */

  25. #ifndef TMMACH_H
  26. #include <tmmach.h>
  27. #endif
  28. #ifndef NOWHAT
  29. static        char        h_tlog[] = "@(#) tuxedo/include/tlog.h        $Revision: 1.1 $";
  30. #endif


  31. #include <Uunix.h>
  32. #include <tmstruct.h>
  33. #include <gpsys.h>

  34. /* TLOG constants */
  35. #define TLOGLRMGC        -999999                /* magic number for the log records */
  36. #define TLOGMAXSIZE         2048                /* maximum number of pages/log */
  37. #define TLOGDFLSIZE         100                /* default number of pages/log */
  38. #define TLOGMAXLSN        30000000         /* the range of LSN for TM32I */

  39. #define TIND(p)                ((p) / BITSPERLONG32)
  40. #define TOFST(p)        ((p) % BITSPERLONG32)
  41. #define SET_BIT(b,p)        (b[TIND((p))] |= (01 << ( BITSPERLONG32 - TOFST((p)) -1)))
  42. #define RESET_BIT(b,p)        (b[TIND((p))] &= ~(01 << (BITSPERLONG32 - TOFST((p)) -1)))

  43. /* TLOG record - data part format */
  44. struct tlgrec_data_t {
  45.         TM32I        magic;                        /* magic number - TLOGLRMGC */
  46.         TM32I        tlg_version;                /* version number */
  47.         GTRID        gtrid;                        /* global tran id */
  48.         unsigned short        count;                /* number of entries in grpid array */
  49.         GRPID        loggrp;                        /* coordinator group id */
  50.         GRPID        grpid[TMGMAXGROUPS];        /* group id array */
  51. } ;
  52. #define TLGVERSION 60

  53. /* TLOG record - including both the log data and the TLOG control table */
  54. struct tlgrec_t {
  55.         TM32I                        chksum; /* xor' whole record on TM32I basis */
  56.         struct tlgrec_data_t        data;
  57.         TMTLGCTL                ctl_tbl;
  58. } ;
  59. typedef struct tlgrec_t TLGREC;

  60. extern void         _tmvtoc_errlog _((_TCADEF, char *));
  61. extern short        _tmlocate0 _((_TCADEF, TM32U [], short, short));
  62. extern short        _tmlocate1 _((_TCADEF, TM32U [], short, short));
  63. extern TM32I        _tmcal_chksum _((_TCADEF, TM32I *, int));
  64. extern int        _tlog_commit _((_TCADEF, GTRID *, GRPID, unsigned short,
  65.                                 GRPID [], short *));
  66. extern int        _tlog_eot _((_TCADEF, short));
  67. extern int        _tlog_warmstart _((_TCADEF));
  68. extern int        _tlog_create _((_TCADEF, char *, short, char *, long));
  69. extern int        _tlog_destroy _((_TCADEF, char *, char *, long));
  70. extern int        _tlog_reinit _((_TCADEF, char *, short, char *, long));
  71. extern int        _tlog_start _((_TCADEF, int));
  72. extern void        _tlog_stop _((_TCADEF, int));
  73. extern int        _tlog_open _((_TCADEF, char *, char *, long, short, long));
  74. extern int        _tlog_close _((_TCADEF, int));

  75. #endif
复制代码
同上,里面至今还清晰的保留了UNIX系统实验室的标记。。。。
  1. /*      Copyright (c) 1990 Unix System Laboratories, Inc.
  2.         All rights reserved

  3.         THIS IS UNPUBLISHED PROPRIETARY
  4.         SOURCE CODE OF Unix System Laboratories, Inc.
  5.         The copyright notice above does not
  6.         evidence any actual or intended
  7.         publication of such source code.
  8. */
复制代码

论坛徽章:
0
100 [报告]
发表于 2012-05-18 21:07 |只看该作者
本帖最后由 三人行必有吾师 于 2012-05-18 21:08 编辑

3. Tuxedo的C语言代码

比如核心的BBL.c(太长了,这里只取其小片段)
  1. /*
  2. * After checking for transaction timeout,
  3. * this routine goes through the registry table entry list and decrements
  4. * the timeleft field for blocking processes.  If this becomes less than
  5. * or equal to zero, then the process is sent a message to be woken up.
  6. */

  7. static void
  8. #ifdef _TMPROTOTYPES
  9. chk_blockers(_TCADEF)
  10. #else
  11. chk_blockers(_TCARG)
  12. _TCADEF;
  13. #endif
  14. {
  15.         TMRTE *rte, *res, *endp;
  16.         TMSTE tmpste, *ste;
  17.         TMMSG wkmsg;
  18.         TMPROC dummy;        /* for _tmnwkill(_TCARG) */
  19.         static long        oldmday = 0;
  20.         time_t timebuf;
  21.         struct tm *tmptr;
  22.         long decrement;
  23.         static        long         rte_scan_first = 0;
  24.         static        long        getenv_done = 0;
  25.         char         *chptr;
  26.         int spawn_flags = SPAWN_RESTARTSRV|SPAWN_CLEANUPSRV;

  27.         _TCDECLPTR(TUX);

  28.         TMDEBUG(10,("> chk_blockers()"));

  29.         /*
  30.          * Check if new day - if so, write message to userlog
  31.          * so that version information is logged.
  32.          */
  33.         timebuf = (time_t)TUX->_TUX__tmbbp->bbmeters.bm_timestamp;
  34.         tmptr = localtime(&timebuf);

  35.         if (tmptr->tm_mday != oldmday) {
  36.                 /*
  37.                  * Don't log when process first starts since startup
  38.                  * message will already cause version information to
  39.                  * be written.
  40.                  */
  41.                 if (oldmday)
  42.                         (void) userlog(" ");
  43.                 oldmday = tmptr->tm_mday;
  44.         }
  45.         if (!tmsyslock(&TUX->_TUX__tmbbp->bbparms)) {
  46.                 TMDEBUG(10,("< chk_blockers(10) returns"));
  47.                 return;
  48.         }
  49.         /* TRANSACTION MGMT chk_blockers calls _tmgttscan */
  50.         /* CR050720 move _tmgttscan to after while() loop */
  51.         if (!rte_scan_first && !getenv_done) {
  52.                 if ((chptr = tuxgetenv("BBLRTESCANFIRST")) != NULL
  53.                         && (*chptr == 'Y' || *chptr ==  'y'))
  54.                 rte_scan_first = 1;
  55.                 getenv_done = 1;
  56.         }
  57.         if (!rte_scan_first)
  58.                 _tmgttscan(_TCARG);

  59.         res = TUX->_TUX__tmrgstry + TUX->_TUX__tmbbp->bbparms.maxaccsrs;        /* begin of reserved */
  60.         if (TUX->_TUX__tmbbp->bbmap.rgstuse == NIL)
  61.                 rte = res;
  62.         else
  63.                 rte = REGISTRY(TUX->_TUX__tmbbp->bbmap.rgstuse);
  64.         endp = TUX->_TUX__tmrgstry + (TUX->_TUX__tmbbp->bbparms.maxaccsrs + MAXADMIN);

  65.         _tminithdr(_TCARG,&wkmsg);
  66.         wkmsg.mhdr.flags = TMALARM;
  67.         decrement = time((time_t *)NULL) - scanunit_interval_start_time;

  68.         /* CR050720 next 2 lines */
  69.         if (rte_scan_first)
  70.                 (void) tmbblock();
  71.         while (rte < endp) {
  72.                 if ((rte->rt_svctimeout > 0) && (rte->rflags & SERVER)) {
  73.                         /* Processing a service, decrement time left to svc */
  74.                         if (rte->rt_svctimeout <= TUX->_TUX__tmbbp->bbparms.scanunit) {
  75.                                 dummy.PRmid = TUX->_TUX__tmproc.PRmid;
  76.                                 dummy.PRpid = rte->pid;
  77.                                 if (_tmnwkill(_TCARG,&dummy,SIGKILL,5) < 0) {
  78.                                         (void) userlog(_MHS_(CMDTUX_CAT,1666,
  79.                                                         MHS_USERLOG,
  80. "WARN: Could not terminate server(%ld) processing after SVCTIMEOUT"),
  81.                                                         (long) rte->pid);
  82.                                 } else {
  83.                                         (void) userlog(_MHS_(CMDTUX_CAT,1667,
  84.                                                         MHS_USERLOG,
  85. "WARN: Server(%ld) processing terminated after SVCTIMEOUT"), (long) rte->pid);
  86.                                         generate_service_timeout_event(_TCARG, rte);
  87.                                         /* status with TMSVCTIMEDOUT
  88.                                          *        indicates timeout occured so
  89.                                          *        cleanupsrv can detect a timeout
  90.                                          *        for the errordetail
  91.                                          */
  92.                                         SVRGRP(&tmpste) = rte->rt_grpid;
  93.                                         SVRID(&tmpste)  = rte->rt_srvid;
  94.                                         if (tmrsvrs(S_GRPID, &tmpste, &tmpste, NULL) == 1) {
  95.                                                 ste = SERVERS(tmpste.hashlist.rlink);
  96.                                                 ste->global.status |= SVCTIMEDOUT;
  97.                                         }
  98.                                         /* Note that we do not reset
  99.                                          * spawn_flags before this call, so
  100.                                          * that multiple calls will result in
  101.                                          * at most one restartsrv and one
  102.                                          * cleanupsrv process. */
  103.                                         _tmbbclean(_TCARG, TUX->_TUX__tmproc.PRmid, NOTAB, &spawn_flags);
  104.                                         rte->rt_svctimeout = 0;
  105.                                 }
  106.                         } else {
  107.                                 /* decrement by actual time since last scan */
  108.                                 rte->rt_svctimeout -= decrement;

  109.                                 /* reset to zero if negative */
  110.                                 if (rte->rt_svctimeout < 0) rte->rt_svctimeout = 0;
  111.                         }
  112.                 }
  113.                 if (rte->hndl.mtype > 0) {
  114.                         /* found a blocker */
  115.                         if (rte->hndl.timeleft <= TUX->_TUX__tmbbp->bbparms.scanunit) {
  116.                                 /* timeout */
  117.                                 rte->hndl.timeleft = 0;
  118.                                 if (rte->rflags & CONV_RECV)
  119.                                         wkmsg.tmhdr.flag = TPCONV;
  120.                                 wkmsg.mhdr.mtype = rte->hndl.mtype;
  121.                                 wkmsg.tmhdr.rplyiter = rte->hndl.rplyiter;
  122.                                 wkmsg.mhdr.qaddr = rte->hndl.qaddr;
  123. #ifdef CHKSUM
  124.                                 mk_chksum(_TCARG,&wkmsg,0);
  125.                                 mk_chksum(_TCARG,&wkmsg,TMENCODE);
  126. #endif
  127.                                 /* no ENCODEing necessary, local only */
  128.                                 /* CR050720  next 2 lines */
  129.                                 if (rte_scan_first)
  130.                                         (void) tmbbunlock();
  131.                                 if (tmsendm(&wkmsg, TPSIGRSTRT|TPNOBLOCK) < 0) {
  132.                                         if (tperrno != TPEBLOCK)
  133.                                                 (void) userlog( _MHS_(CMDTUX_CAT,42,MHS_USERLOG,
  134. "WARN: BBL failed to wake up the blocking process - %ld"),
  135.                                                 (long)rte->pid);
  136.                                 }
  137.                                 /* CR050720  next 2 lines */
  138.                                 if (rte_scan_first)
  139.                                         (void) tmbblock();
  140.                         } else { /* decrement */
  141.                                 /* decrement by actual time since last scan */
  142.                                 rte->hndl.timeleft -= decrement;

  143.                                 /* reset to zero if negative */
  144.                                 if (rte->hndl.timeleft < 0) rte->hndl.timeleft = 0;
  145.                         }
  146.                 }
  147.                 if (rte >= res) {
  148.                         rte++;
  149.                         continue;
  150.                 }
  151.                 if (rte->nextreg == NIL)
  152.                         rte = res;
  153.                 else
  154.                         rte = REGISTRY(rte->nextreg);
  155.         }
  156.         /* CR050720 next 3 lines */
  157.         if (rte_scan_first) {
  158.                 (void) tmbbunlock();
  159.                 _tmgttscan(_TCARG);
  160.         }
  161.         (void) tmsysunlock(&TUX->_TUX__tmbbp->bbparms);
  162.         TMDEBUG(10,("< chk_blockers(20) returns"));
  163.         return;
  164. }
复制代码
其中的
  1. /* CR050720 move _tmgttscan to after while() loop */
复制代码
  1. /* CR050720 next 2 lines */
  2.         if (rte_scan_first)
  3.         (void) tmbblock();
复制代码
是指补丁修改的印记和注释,在大家安装Tuxedo补丁时,或者在udataobj目录下patchlev里看到的CRxxxxx就是对应的这些代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP