CN104021196B - 一种针对System V消息队列的I/O复用方法 - Google Patents
一种针对System V消息队列的I/O复用方法 Download PDFInfo
- Publication number
- CN104021196B CN104021196B CN201410266122.5A CN201410266122A CN104021196B CN 104021196 B CN104021196 B CN 104021196B CN 201410266122 A CN201410266122 A CN 201410266122A CN 104021196 B CN104021196 B CN 104021196B
- Authority
- CN
- China
- Prior art keywords
- read
- fifo
- select
- wsh
- event
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/245—Query processing
- G06F16/2453—Query optimisation
- G06F16/24532—Query optimisation of parallel queries
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computational Linguistics (AREA)
- Data Mining & Analysis (AREA)
- Databases & Information Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Multi Processors (AREA)
- Data Exchanges In Wide-Area Networks (AREA)
Abstract
本发明涉及网络通信领域,提供了一种针对System V消息队列的I/O复用方法,包括以下步骤:步骤1,启动WSH进程,创建有名管道FIFO和消息队列Q_OUT;步骤2,WSH进程以非阻塞的只读方式打开有名管道FIFO,获取FIFO的描述符标识;步骤3,WSH进程将FIFO的描述符标识放入可读描述字集合,并调用select系统调用对网络socket和FIFO描述符同时进行I/O复用。本发明的复用方法利用了有名管道技术FIFO的描述符标识与Socket的描述符类似,可以被select调用和支持,通过为WSH进程添加FIFO组件,从而借助FIFO达到了对System V消息队列I/O复用的目的。
Description
技术领域
本发明涉及网络通信领域,提供了一种针对System V消息队列的I/O复用方法。
背景技术
System V消息队列:System V是贝尔实验室开发的一个Unix分支版本,消息队列是由System V提供的IPC(Interprocess Communication)进程间通信的机制之一。
I/O复用(I/O multiplexing):当一个进程需要同时处理多个网络连接或交互式输入时,进程通过预先告知操作系统内核,使得内核一旦发现进程指定的一个或多个I/O条件就绪时,它就通知进程进行处理,该机制称为I/O复用,目前支持I/O复用的系统调用包括select、poll、epoll等调用方式。
Socket:网络套接字,一种网络通讯技术。
FIFO:有名管道,一种进程间通信的技术,支持在不同进程之间单向的数据传输。
航班查询系统是民航旅游分销系统最核心的功能之一,它服务于航空公司、机票代理人和购票旅客,为他们供准确实时的国内国际航班详细数据,为广大旅客的购票和出行安排提供支持。该系统已经为民航代理人、淘宝、游易、艺龙等大型机票分销网站,国航、东航、海航等航空公司的机票直销网站提供航班查询功能。该系统访问量达到2000TPS,具有很高的可靠性和性能要求,因此该系统采用了多进程架构,分为网络通信进程和航班查询进程两类。网络通信是航班查询系统需要处理的主要技术之一。WSH(WorkstationHandler)进程是航班查询系统专门负责服务端网络通信的进程,一方面它需要处理多个客户端的socket网络连接,从中接收不同客户端的请求报文并放至航班查询进程的请求队列中,同时该进程还要处理一个本地System V消息队列Q_OUT,从中获取应答报文返回客户端,如图1所示。因此WSH进程需要采用I/O复用技术来同时处理来自网络连接和System V消息队列的报文。
通过采用select或poll等系统调用可以实现多个网络连接的I/O复用,但是由于System V消息队列的标识符不属于描述符标识,因此不能在消息队列Q_OUT上采用select或poll等调用。
目前解决该问题的已知方案还有采用多线程技术,也即采用不同的线程分别去处理Q_OUT队列和网络Socket的报文。
多线程方案采用不同的线程分别去处理Q_OUT队列和网络Socket的报文,这种方案的缺点如下:
1)多线程的编程实现难度高,调试复杂;
2)多线程的可靠性较差,一个线程挂掉将导致整个进程挂掉;
3)多线程比单线程有额外的资源开销要求(例如内存和多核CPU),在某些特定用户的环境下(单核CPU和内存受限),多线程方案不能被采用。
发明内容
基于以上问题,本发明提供了一种针对System V消息队列的I/O复用方法,以使得WSH进程可以同时处理来自网络连接和System V消息队列的报文,该方法也可以用于其它有类似服务端处理网络通信需求的系统。本发明的复用方法利用了有名管道(FIFO)技术,FIFO的描述符标识与Socket的描述符类似,可以被select调用和支持,因此通过为WSH进程添加FIFO组件,WSH进程通过select调用对FIFO和不同的网络Socket连接进行I/O复用,航班查询进程在放Q_OUT队列的同时,往FIFO中发送1个字节的报文作为event事件,WSH通过select调用获取该事件,进而触发处理Q_OUT队列中的应答报文,从而借助FIFO达到了对System V消息队列I/O复用的目的。
另外,由于针对有名管道和消息队列的操作是多个独立API,不是原子操作,会带来不一致问题,造成报文发送延迟或死锁,因此本发明还设计了从消息队列接收报文的处理流程来解决。
本发明通过借用有名管道FIFO,使得专门负责服务端网络通信的进程WSH可以在单进程、单线程运行模式下实现对网络Socket和System V消息队列I/O复用的目的。
本方法使用的各种技术比如socket通讯技术、System V消息队列操作、select I/O复用模型都是成熟技术,不再赘述。本方法涉及航班查询进程和WSH进程,是由这两个进程借助有名管道FIFO协同实现对消息队列Q_OUT的I/O复用。
本发明公开了一种针对System V消息队列的I/O复用方法,包括以下步骤:
步骤1,启动WSH进程,创建有名管道FIFO和消息队列Q_OUT;
步骤2,WSH进程以非阻塞的只读方式打开有名管道FIFO,获取FIFO的描述符标识;
步骤3,WSH进程将FIFO的描述符标识放入可读描述字集合,并调用select调用,对网络socket和FIFO描述符同时进行I/O复用;
步骤4,航班查询进程调用封装好的API;
步骤5,WSH进程被select调用触发,读取有名管道的事件和消息队列Q_OUT中的应答报文。
进一步地,步骤3进一步包括,如果有客户端发送请求报文时,WSH进程会被select调用触发,然后将请求报文发送至航班查询进程。
进一步地,步骤4中航班查询进程通过非阻塞只读的方式打开有名管道FIFO。
进一步地,步骤4进一步包括航班查询进程将应答报文放入消息队列Q_OUT,同时打开并将事件报文放入有名管道FIFO。
进一步地,步骤5进一步包括,航班查询进程放入有名管道一个字节的事件报文后,WSH进程就会被select调用触发,进而从有名管道中读取一个字符,再从消息队列Q_OUT读取应答报文,然后将数据发送给客户端。
进一步地,步骤5进一步包括以下步骤:
a)首先WSH进程判断上次从消息队列Q_OUT取到的应答个数是否超过阈值,如果超过,select调用不设置超时;如果没超过,则select调用设置超时;
b)基于步骤a)中的超时设置进行select调用;
c)select调用返回后,判断有名管道是否有事件,如果有则执行步骤d),没有则执行步骤e);
d)调用read方法读取有名管道事件,如果没读到事件则执行步骤g);如果读到事件,则继续调用msgrcv方法读取Q_OUT队列数据;如果调用msgrcv方法没读到Q_OUT队列数据,继续从步骤d)重新开始,如果读到Q_OUT队列数据执行步骤f);
e)如果有名管道没有事件或者select调用超时,则调用msgrcv方法读取Q_OUT队列数据,如果没读到Q_OUT队列数据执行步骤g),如果读到Q_OUT队列数据则调用read方法读取有名管道事件,继续执行步骤f);
f)将计数器Rcv_Qout_Num加1,并将数据发送客户端,然后判断Rcv_Qout_Num是否大于阈值,如果大于阈值,继续执行步骤g),如果不大于阈值则继续从步骤c)重新开始;
g)基于select调用的返回,读取客户端从网络socket发送来的请求数据。
进一步地,步骤a)中select调用设置超时时间为1毫秒。
进一步地,步骤a)以及步骤f中的阈值为10。
采用本发明的复用方法,具备如下优点:
1)复用了select的处理模型,没有对普通socket处理流程带来复杂变化,同时具备很好的处理性能;
2)保持了单进程、单线程的特点,适用范围广泛;
3)有名管道FIFO和System V IPC队列均是操作系统提供,访问他们的接口也都是系统调用,保证了程序的可靠性。
附图说明
图1为本发明关于System V消息队列的I/O复用的现有技术;
图2为本发明针对System V消息队列的I/O服用方法;
图3为本发明WSH进程基于select事件的实时处理流程。
具体实施方式
以下将结合附图,对本发明的针对System V消息队列的I/O复用方法作出进一步的详细说明:
本方法使用的各种技术比如socket通讯技术、System V消息队列操作、select I/O复用模型都是成熟技术,不再赘述。本方法涉及航班查询进程和WSH进程,是由这两个进程借助有名管道FIFO协同实现对消息队列Q_OUT的I/O复用。
如图2所示,本发明中针对System V消息队列的I/O复用方法包括步骤如下:
步骤一、启动WSH进程,WSH进程在启动时创建有名管道FIFO和消息队列Q_OUT。
创建有名管道FIFO是调用系统调用mkfifo:
int mkfifo(const char*path,mode_t mode);//其中path是基于配置文件的配置,例如path=/opt/app/config/todewsh.fifo。
创建消息队列Q_OUT是调用系统调用msgget:
int msgget(key_t key,int msgflg);//其中key是基于配置文件的配置,例如ipckey=372539。
步骤二、WSH进程以非阻塞的只读方式打开有名管道FIFO,获取FIFO的描述符标识,用于接下来进行I/O复用的调用。
这里需要注意的是,FIFO是半双工的,也即FIFO是不能够打开来既读又写,另外还基于FIFO的特性,如果FIFO当前没有被打开来写的话,以阻塞方式打开FIFO只读的操作会被阻塞,由于WSH进程启动时并不能保证已有航班查询进程打开有名管道FIFO来写,所以WSH进程必须以非阻塞的方式打开有名管道FIFO来读:
int fiforead=open(“/opt/app/config/todewsh.fifo”,O_RDONLY|O_NONBLOCK);
步骤三、WSH进程将FIFO的描述符标识fiforead放入可读描述字集合,并调用select系统调用对网络socket和FIFO描述符同时进行I/O复用。
WSH进程将FIFO的描述符标识fiforead放入可读描述字集合,同时也将客户端的网络Socket加入相应描述字集合,然后调用select进行I/O复用。如果有客户端发送请求报文时,WSH进程会被select调用触发,去接收数据,然后把请求报文发送至航班查询进程。
步骤四、航班查询进程调用封装好的API(应用程序编程接口)Server_NetPutMsg实现将应答报文放入Q_OUT队列,同时打开并将事件报文放入todewsh.fifo。
Server_NetPutMsg函数首先调用msgsnd系统调用,将应答报文放入消息队列Q_OUT,如果放成功,再以只写的方式打开todewsh.fifo,为了防止航班查询进程被阻塞,仍然要以非阻塞的方式打开:intfifowrite=open(“/opt/app/config/todewsh.fifo”,O_WRONLY|O_NONBLOCK);打开以后再调用系统调用write往管道todewsh.fifo写入一个字符‘T’当做事件报文。
步骤五、WSH进程被select调用触发,读取管道的事件和消息队列Q_OUT中的应答报文。
航班查询进程放入管道todewsh.fifo一个字节的事件后,WSH进程就会被select调用触发,进而首先从管道中读取一个字符,再从消息对了Q_OUT读取应答报文,然后将数据发送给客户端。
这里需要注意的是步骤四中,Server_NetPutMsg函数将应答报文放入消息队列Q_OUT和打开并将事件报文放入管道todewsh.fifo事件是分开的三个API,不是原子操作,所以存在放Q_OUT成功,放管道事件失败的可能性,包括从Q_OUT读取应答报文和从管道读取事件也不是一个API,同样存在不一致的情况发生。当这种情况发生时,如果WSH进程只是基于select的事件进行处理的话,势必造成Q_OUT的数据延迟到下一次管道事件发送成功时才能被取到,这对实时性要求很高的在线系统来说是不允许的。因此通过图3所示的设计,如下处理流程来避免以上情况发生。
1)首先判断上次从Q_OUT取到的应答个数是否超过10个,如果超过,则Q_OUT仍有待处理数据的可能性很大,因此select调用不设置超时;如果没超过,则select调用设置超时为1毫秒;
2)基于以上的超时设置进行select调用;
3)select返回后判断管道是否有事件,如果有则执行第4)步,没有则执行第5)步。
4)调用read方法读取管道事件,如果没读到事件则执行第7)步;如果读到事件,则继续调用msgrcv方法读取Q_OUT队列数据。如果没读到继续从第4)步重新开始,如果读到则执行第6)步。
5)如果管道没有事件或者select超时,为了避免管道事件和Q_OUT队列数据的不一致造成延误队列数据发送,则调用msgrcv方法读取Q_OUT队列数据。如果没读到数据执行第7)步,如果读到则调用read方法尝试读取管道事件,不论管道有无事件,继续执行步骤6)。
6)将计数器Rcv_Qout_Num加1,并将数据发送客户端,然后判断Rcv_Qout_Num是否大于10个,如果大于10,继续执行第7)步,如果不大于10则继续从第3)步重新开始。
7)继续基于select的返回处理网络事件,以读取客户端的请求数据,这块逻辑与普通网络I/O复用处理相同,不再赘述。处理完毕后继续从第1)步循环处理。
这里需要注意的是步骤四中,Server_NetPutMsg函数放消息队列Q_OUT和打开并放管道todewsh.fifo事件是分开的三个API,不是原子操作,所以存在放Q_OUT成功,放管道事件失败的可能性,包括从Q_OUT读取应答报文和从管道读取事件也不是一个API,同样存在不一致的情况发生。当这种情况发生时,如果WSH进程只是基于select的事件进行处理的话,势必造成Q_OUT的数据延迟到下一次管道事件发送成功时才能被取到,这对实时性要求很高的在线系统来说是不允许的。因此通过设计如下处理流程来避免以上情况发生。
采用本发明的复用方法,具备如下优点:
1)复用了select的处理模型,没有对普通socket处理流程带来复杂变化,同时具备很好的处理性能;
2)保持了单进程、单线程的特点,适用范围广泛;
3)有名管道FIFO和System V IPC队列均是操作系统提供,访问他们的接口也都是系统调用,保证了程序的可靠性。
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。
Claims (7)
1.一种针对System V消息队列的I/O复用方法,其特征在于,包括以下步骤:
步骤1,启动WSH进程,创建有名管道FIFO和消息队列Q_OUT;
步骤2,WSH进程以非阻塞的只读方式打开有名管道FIFO,获取FIFO的描述符标识;
步骤3,WSH进程将FIFO的描述符标识放入可读描述字集合,并调用select调用,对网络socket和FIFO描述符同时进行I/O复用;
步骤4,航班查询进程调用封装好的API,实现将应答报文放入Q_OUT队列,同时打开并将事件报文放入有名管道;
步骤5,WSH进程被select调用触发,读取有名管道的事件和消息队列Q_OUT中的应答报文;
步骤5进一步包括以下步骤:
a)首先WSH进程判断上次从消息队列Q_OUT取到的应答个数是否超过阈值,如果超过,select调用不设置超时;如果没超过,则select调用设置超时;
b)基于步骤a)中的超时设置进行select调用;
c)select调用返回后,判断有名管道是否有事件,如果有则执行步骤d),没有则执行步骤e);
d)调用read方法读取有名管道事件,如果没读到事件则执行步骤g);如果读到事件,则继续调用msgrcv方法读取Q_OUT队列数据;如果调用msgrcv方法没读到Q_OUT队列数据,继续从步骤d)重新开始,如果读到Q_OUT队列数据执行步骤f);
e)如果有名管道没有事件或者select调用超时,则调用msgrcv方法读取Q_OUT队列数据,如果没读到Q_OUT队列数据执行步骤g),如果读到Q_OUT队列数据则调用read方法读取有名管道事件,继续执行步骤f);
f)将计数器Rcv_Qout_Num加1,并将数据发送客户端,然后判断Rcv_Qout_Num是否大于阈值,如果大于阈值,继续执行步骤g),如果不大于阈值则继续从步骤c)重新开始;
g)基于select调用的返回,读取客户端从网络socket发送来的请求数据;
其中,WSH进程是指负责服务端与客户端之间的网络通信的进程。
2.如权利要求1所述的复用方法,其特征在于:
步骤3进一步包括,如果有客户端发送请求报文时,WSH进程会被select调用触发,然后将请求报文发送至航班查询进程。
3.如权利要求1所述的复用方法,其特征在于:
步骤4进一步包括航班查询进程将应答报文放入消息队列Q_OUT,同时打开并将事件报文放入有名管道FIFO。
4.如权利要求3所述的复用方法,其特征在于:
步骤4中航班查询进程通过非阻塞只读的方式打开有名管道FIFO。
5.如权利要求1所述的复用方法,其特征在于:
步骤5进一步包括,航班查询进程放入有名管道一个字节的事件报文后,WSH进程就会被select调用触发,进而从有名管道中读取一个字符,再从消息队列Q_OUT读取应答报文,然后将数据发送给客户端。
6.如权利要求1所述的复用方法,其特征在于,步骤a)中select调用设置超时时间为1毫秒。
7.如权利要求1所述的复用方法,其特征在于,步骤a)以及步骤f中的阈值为10。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410266122.5A CN104021196B (zh) | 2014-06-13 | 2014-06-13 | 一种针对System V消息队列的I/O复用方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410266122.5A CN104021196B (zh) | 2014-06-13 | 2014-06-13 | 一种针对System V消息队列的I/O复用方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN104021196A CN104021196A (zh) | 2014-09-03 |
CN104021196B true CN104021196B (zh) | 2017-04-26 |
Family
ID=51437950
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410266122.5A Active CN104021196B (zh) | 2014-06-13 | 2014-06-13 | 一种针对System V消息队列的I/O复用方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104021196B (zh) |
Families Citing this family (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105159774B (zh) * | 2015-07-08 | 2018-06-12 | 清华大学 | 一种api请求保序处理方法及系统 |
CN105357266B (zh) * | 2015-09-30 | 2018-11-16 | 山东乾云启创信息科技股份有限公司 | 适合多种场景的socket通信与进程管理通用平台及方法 |
CN105978930A (zh) * | 2016-04-15 | 2016-09-28 | 深圳市永兴元科技有限公司 | 网络数据交换方法及装置 |
CN110691002B (zh) * | 2018-07-05 | 2021-07-23 | 武汉斗鱼网络科技有限公司 | 一种中断检测方法及装置 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5905905A (en) * | 1997-08-05 | 1999-05-18 | Adaptec, Inc. | System for copying IOBS from FIFO into I/O adapter, writing data completed IOB, and invalidating completed IOB in FIFO for reuse of FIFO |
CN102576245A (zh) * | 2009-10-27 | 2012-07-11 | 诺基亚公司 | 非易失性设备 |
CN103096168A (zh) * | 2012-12-25 | 2013-05-08 | 四川九洲电器集团有限责任公司 | 一种基于iptv机顶盒的数据通信并行处理方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
KR101534790B1 (ko) * | 2008-10-15 | 2015-07-07 | 마벨 월드 트레이드 리미티드 | 데이터 저장 시스템들을 위한 구조 |
-
2014
- 2014-06-13 CN CN201410266122.5A patent/CN104021196B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5905905A (en) * | 1997-08-05 | 1999-05-18 | Adaptec, Inc. | System for copying IOBS from FIFO into I/O adapter, writing data completed IOB, and invalidating completed IOB in FIFO for reuse of FIFO |
CN102576245A (zh) * | 2009-10-27 | 2012-07-11 | 诺基亚公司 | 非易失性设备 |
CN103096168A (zh) * | 2012-12-25 | 2013-05-08 | 四川九洲电器集团有限责任公司 | 一种基于iptv机顶盒的数据通信并行处理方法 |
Non-Patent Citations (1)
Title |
---|
孙骏."嵌入式消息队列子系统设计与实现".《中国优秀硕士学位论文全文数据库,信息科技辑》.2007,(第03期), * |
Also Published As
Publication number | Publication date |
---|---|
CN104021196A (zh) | 2014-09-03 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106201694B (zh) | 一种分布式系统下执行定时任务的配置方法及系统 | |
US9307017B2 (en) | Member-oriented hybrid cloud operating system architecture and communication method thereof | |
US10015238B2 (en) | Command processing in distributed computing systems | |
JP5191062B2 (ja) | ストレージ制御システム、ストレージ制御システムに関する操作方法、データ・キャリア及びコンピュータ・プログラム | |
EP3837604B1 (en) | In situ triggered function as a service within a service mesh | |
US7634514B2 (en) | Synchronizing file system directories | |
Welsh et al. | A design framework for highly concurrent systems | |
US8341643B2 (en) | Protecting shared resources using shared memory and sockets | |
US10871918B2 (en) | Writing composite objects to a data store | |
CN104021196B (zh) | 一种针对System V消息队列的I/O复用方法 | |
Zhou et al. | Electrode: Accelerating Distributed Protocols with {eBPF} | |
CN105700939A (zh) | 一种分布式系统中多线程同步的方法和系统 | |
CN107710155B (zh) | 用于并行地引导应用服务器的系统和方法 | |
JP2008529113A (ja) | アプリケーション・プロセスにおいて内部イベントをリプレイするための非侵入的方法およびこの方法を実装するシステム | |
WO2014206289A1 (en) | Method and apparatus for outputting log information | |
US10140121B2 (en) | Sending a command with client information to allow any remote server to communicate directly with client | |
WO2016078362A1 (zh) | 一种双主控隔离的逐板升级的方法及装置 | |
CN108804238A (zh) | 一种基于远程过程调用的软总线通信方法 | |
CN109756461A (zh) | 一种基于netty的远程过程调用方法 | |
CN113535362A (zh) | 一种分布式调度系统架构和微服务工作流调度方法 | |
CN113703997A (zh) | 集成多种消息代理的双向异步通信中间件系统及实现方法 | |
JP4659872B2 (ja) | クラスタシステム制御プログラム、クラスタシステム、クラスタシステム制御方法 | |
CN104866528A (zh) | 多平台数据采集方法及系统 | |
US9473561B2 (en) | Data transmission for transaction processing in a networked environment | |
US8141103B2 (en) | Solution for modifying a queue manager to support smart aliasing which permits extensible software to execute against queued data without application modifications |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
CP02 | Change in the address of a patent holder |
Address after: 100085 Yumin Street, Houshayu Town, Shunyi District, Beijing Patentee after: CHINA TRAVELSKY HOLDING Co. Address before: 100010, No. 157 West Fourth Street, Beijing, Dongcheng District Patentee before: CHINA TRAVELSKY HOLDING Co. |
|
CP02 | Change in the address of a patent holder |