1 Overview1.1 The Network class1.2 The Network::MessageTokenizer class การแปล - 1 Overview1.1 The Network class1.2 The Network::MessageTokenizer class ไทย วิธีการพูด

1 Overview1.1 The Network class1.2

1 Overview
1.1 The Network class
1.2 The Network::MessageTokenizer class
1.3 The Network::PacketParser class
1.4 The Network::Receive, Network::Send and Network::ClientReceive classes
1.5 The Network::Receive::ServerTypeX and Network::Send::ServerTypeX class
1.6 How it all works together
2 Handling multiple server types (message parser part)
2.1 Implementation details
2.1.1 Example 1: adding a new message handler
2.1.2 Example 2: handling a different server type
3 Handling multiple server types (message sender part)
4 Using the message sender
4.1 Compatibility notes
5 Hooks
5.1 "packet_pre/$HANDLER_NAME"
5.2 "packet/$HANDLER_NAME"
6 Appendix A: introduction to the Ragnarok Online protocol
7 Appendix B: recvpackets.txt and handling message lengths
8 Appendix C: obfuscation of outgoing messages
8.1 Padded packets
8.2 Encrypted message IDs
9 Original article
Overview
The OpenKore network subsystem roughly consists of the following classes:

The Network class
This is the connection manager. It manages the TCP/IP socket connection with the server, and handles things like connection, disconnection, sending data to the server, receiving data from the server, etc. But it doesn't do much else.

Schematically, it looks like this:

File:Network-subsystem.jpg

Upon connection to the server, it creates two objects:

A message parser object, which is of class Network::Receive::ServerTypeX. Whenever a message is received from the server, that message is passed to the message parser.
A message sender object (not seen in the above diagram), which is of class Network::Send::ServerTypeX. This is used for sending messages to the server.
There are several implementations of Network class: Network::DirectConnection, Network::XKore and Network::XKoreProxy.

The Network::MessageTokenizer class
This is a tokenizer class. It extracts discrete server or client messages from a byte stream passed by the connection manager. But it doesn't do much else.

The Network::PacketParser class
This is a base message parser class. It parses messages passed by the connection manager into hashes with message data, as well as does reverse operation - generates messages from hashes with message data. But it doesn't do much else.

Afterwards, parsed messages are handled by built-in handlers in following classes and, with hooks, by plugins or other modules.

Additionally, there is API for modifying or dropping messages to alter any further processing.

The Network::Receive, Network::Send and Network::ClientReceive classes
There classes are descendants of Network::PacketParser class.

Network::Receive and Network::Send are parser helper classes. They contain parser helpers which serve as a workaround in the absense of the capable parser subsystem.

Network::Receive and Network::ClientReceive are message handling classes. They contain built-in handlers for messages coming from the server (Network::Receive) or from the client (Network::ClientReceive), which store information from network messages to be used later in other modules (like the AI).

Network::Send is the message sender class. It encapsulates network messages into simple, easy-to-use functions to be used outside of network subsystem.

Any descendant ServerType class may customize message handlers and parser helpers, but they should refrain from that other than for servertype-specific features and debugging.

The Network::Receive::ServerTypeX and Network::Send::ServerTypeX class
These are serverType description classes. They describe network message identifiers and structures for different servers. But they shouldn't do much else.

Note that none of these classes, from the connection manager to the serverType descriptions, should contain any AI code.

How it all works together
Main initialization code creates a connection manager instance and a message tokenizer instance:

$net = new Network::DirectConnection;

$incomingMessages = new Network::MessageTokenizer(\%recvpackets);
Connection manager creates a packet parser instance:

$packetParser = Network::Receive->create($wrapper, $serverType);
Main loop passes information from connection manager $net to message tokenizer $incomingMessages:

$incomingMessages->add($net->serverRecv);
Message tokenizer with data and a message handler $packetParser are passed to a packet parser $packetParser to process all available messages:

@packets = $packetParser->process($incomingMessages, $packetParser);

# compare with outgoing packets:
# @packets = $messageSender->process($outgoingClientMessages, $clientPacketHandler);
Packets are passed back to the connection manager, which passes them to XKore clients:

$net->clientSend($_) for @packets;
Meanwhile, the packet parser calls custom parsers, hooks and built-in handlers:

my $custom_parser = $self->can("parse_$handler_name")
if ($custom_parser) {
$self->$custom_parser(\%args);
}

Plugins::callHook("packet_pre/$handler_
0/5000
จาก: -
เป็น: -
ผลลัพธ์ (ไทย) 1: [สำเนา]
คัดลอก!
ภาพรวม 11.1 ระดับชั้นเครือข่าย1.2 การคลา Network::MessageTokenizer1.3 การคลา Network::PacketParser1.4 การเรียน Network::Receive, Network::Send และ Network::ClientReceive1.5 การคลา Network::Receive::ServerTypeX และ Network::Send::ServerTypeX1.6 วิธีทำงานทั้งหมดเข้าด้วยกัน2 การจัดการหลายชนิดเซิร์ฟเวอร์ (ข้อความส่วนตัวแยกวิเคราะห์)2.1 รายละเอียดดำเนินการ2.1.1 ตัวอย่าง 1: การเพิ่มตัวจัดการข้อความใหม่2.1.2 ตัวอย่าง 2: การจัดการชนิดเซิร์ฟเวอร์อื่น3 การจัดการหลายชนิดเซิร์ฟเวอร์ (ส่วนของผู้ส่งข้อความ)4 ใช้ผู้ส่งข้อความ4.1 หมายเหตุความเข้ากันได้แขวน 5 ตะขอ5.1 "packet_pre / $HANDLER_NAME"5.2 "แพคเก็ต / $HANDLER_NAME"ภาคผนวก a:แนะนำ 6 การโพรโทคอล Ragnarok Online7 ภาคผนวก b: recvpackets.txt และการจัดการข้อความยาว8 ภาคผนวก c: obfuscation ของข้อความขาออก8.1 แพคเก็ตบุ8.2 ข้อเข้ารหัสรหัสบทความต้นฉบับที่ 9ภาพรวมระบบย่อยเครือข่าย OpenKore ประมาณประกอบด้วยการเรียนต่อไปนี้:ระดับเครือข่ายจัดการการเชื่อมต่ออยู่ จัดการการเชื่อมต่อซ็อกเก็ต TCP/IP กับเซิร์ฟเวอร์ และจัดการกับสิ่งต่าง ๆ เช่นการเชื่อมต่อ หลุด ส่งข้อมูลไปยังเซิร์ฟเวอร์ รับข้อมูลจาก server ฯลฯ แต่มันไม่ได้ทำอื่น ๆ อีกมากมายSchematically มันมีลักษณะดังนี้:File:Network-subsystem.jpgเมื่อเชื่อมต่อกับเซิร์ฟเวอร์ สร้างวัตถุที่สอง:ข้อแยกวิเคราะห์วัตถุ ซึ่งเป็นของคลาส Network::Receive::ServerTypeX เมื่อได้รับข้อความจากเซิร์ฟเวอร์ ข้อความที่ถูกส่งผ่านไปแยกวิเคราะห์ข้อความข้อความผู้ส่งวัตถุ (ไม่เห็นในแผนภาพข้างต้น), ซึ่งเป็นของคลาส Network::Send::ServerTypeX นี้ใช้สำหรับการส่งข้อความไปยังเซิร์ฟเวอร์มีปฏิบัติการต่าง ๆ ของเครือข่ายระดับ: Network::DirectConnection, Network::XKore และ Network::XKoreProxyคลา Network::MessageTokenizerนี้เป็นคลา tokenizer แยกแยกเซิร์ฟเวอร์หรือไคลเอ็นต์ข้อความจากกระแสข้อมูลไบต์ผ่าน โดยตัวจัดการการเชื่อมต่อ แต่มันไม่ได้ทำอื่น ๆ อีกมากมายคลา Network::PacketParserนี้เป็นชั้นแยกวิเคราะห์ข้อความพื้นฐาน วิเคราะห์ข้อความที่ส่งผ่าน โดยตัวจัดการการเชื่อมต่อไปเรื่องกับข้อความข้อมูล เป็นตลอดจนย้อนกลับการดำเนินการ - สร้างข้อความจากเรื่องพร้อมข้อมูลข่าวสาร แต่มันไม่ได้ทำอื่น ๆ อีกมากมายหลังจากนั้น แยกวิเคราะห์ข้อความจะถูกจัดการ โดยตัวจัดการ ในชั้นเรียนต่อไปนี้ และ ตะขอ ปลั๊กอินหรือโมดูลอื่น ๆนอกจากนี้ มี API สำหรับแก้ไข หรือวางข้อความการเปลี่ยนแปลงใด ๆ การดำเนินการต่อไปเรียน Network::Receive, Network::Send และ Network::ClientReceiveเรียนไว้ให้ลูกหลานของคลา Network::PacketParserNetwork::Receive และ Network::Send เป็นตัวแยกวิเคราะห์ตัวช่วยเรียน พวกเขาประกอบด้วยตัวช่วยในการแยกวิเคราะห์ซึ่งเป็นการแก้ปัญหาใน absense ของระบบย่อยสามารถแยกวิเคราะห์Network::Receive และ Network::ClientReceive เป็นข้อความการจัดการชั้นเรียน พวกเขาประกอบด้วยในตัวจัดการสำหรับข้อความที่มา จากเซิร์ฟเวอร์ (Network::Receive) หรือ จากไคลเอนต์ (Network::ClientReceive), ซึ่งเก็บข้อมูลจากข้อความเครือข่ายที่จะใช้ในโมดูลอื่น ๆ (เช่น AI)Network::Send เป็นคลาผู้ส่งข้อความ มัน encapsulates ข้อความเครือข่ายเป็นง่าย ง่ายต่อการใช้ฟังก์ชั่นการใช้นอกระบบย่อยเครือข่ายชั้น ServerType เชื้อสายใด ๆ อาจกำหนดตัวจัดการข้อความและตัวช่วยในการแยกวิเคราะห์ แต่พวกเขาควรละเว้นจากที่อื่นที่ไม่ใช่สำหรับคุณลักษณะเฉพาะ servertype และแก้จุดบกพร่องคลา Network::Receive::ServerTypeX และ Network::Send::ServerTypeXเรียน serverType คำอธิบายเหล่านี้ได้ อธิบายระบุข้อความเครือข่ายและโครงสร้างสำหรับเซิร์ฟเวอร์ที่แตกต่างกัน แต่พวกเขาไม่ควรทำอื่น ๆ อีกมากมายโปรดสังเกตว่า ไม่มีคลาสที่เหล่านี้ จากตัวจัดการการเชื่อมต่อนั้น ๆ serverType ควรประกอบด้วยรหัสใด ๆ AIวิธีทำงานทั้งหมดเข้าด้วยกันรหัสหลักการเริ่มต้นสร้างจัดการการเชื่อมต่ออินสแตนซ์และอินสแตนซ์ข้อความ tokenizer:$net = Network::DirectConnection ใหม่$incomingMessages = Network::MessageTokenizer(\%recvpackets) ใหม่จัดการการเชื่อมต่อที่สร้างอินสแตนซ์ตัวแยกวิเคราะห์แพคเก็ต:$packetParser = Network::Receive -> สร้าง ($wrapper, $serverType);หลักส่งผ่านข้อมูลจากตัวจัดการการเชื่อมต่อ $net ถึงข้อ tokenizer $incomingMessages:$incomingMessages -> เพิ่ม ($net -> serverRecv);Tokenizer ข้อความข้อมูลและตัวจัดการข้อความ $packetParser จะผ่านไปที่แบ่งแพคเก็ต $packetParser การประมวลผลข้อความทั้งหมดที่มีอยู่:@packets = $packetParser -> กระบวนการ ($incomingMessages, $packetParser);อันดับเปรียบเทียบกับแพคเก็ตขาออก:# @packets = $messageSender -> กระบวนการ ($outgoingClientMessages, $clientPacketHandler);แพคเก็ตจะถูกส่งผ่านกลับไปจัดการการเชื่อมต่อ ซึ่งส่งพวกเขาไปยังไคลเอนต์ XKore:$net -> clientSend($_) สำหรับ @packetsในขณะเดียวกัน ตัวแยกวิเคราะห์ของแพคเก็ตเรียก parsers ที่กำหนดเอง ตะขอ และในตัวจัดการ:$custom_parser ของฉัน = $self -> can("parse_$handler_name")ถ้า{($custom_parser) $self -> $custom_parser(\%args)}Plugins::callHook ("packet_pre / $handler_
การแปล กรุณารอสักครู่..
ผลลัพธ์ (ไทย) 2:[สำเนา]
คัดลอก!
1 ภาพรวม
1.1 เครือข่ายระดับ
1.2 เครือข่าย :: MessageTokenizer ระดับ
1.3 เครือข่าย :: ระดับ PacketParser
1.4 เครือข่าย :: รับ, เครือข่าย :: ส่งและเครือข่ายการเรียน :: ClientReceive
1.5 เครือข่าย :: :: รับ ServerTypeX และเครือข่าย :: ส่ง :: ServerTypeX ระดับ
1.6 วิธีการทำงานทั้งหมดเข้าด้วยกัน
2 ประเภทการจัดการหลายเซิร์ฟเวอร์ (ข้อความ parser บางส่วน)
2.1 รายละเอียดการดำเนิน
2.1.1 ตัวอย่างที่ 1: การเพิ่มตัวจัดการข้อความใหม่
2.1.2 ตัวอย่างที่ 2: การจัดการชนิดของเซิร์ฟเวอร์ที่แตกต่างกัน
3 การจัดการเซิร์ฟเวอร์หลาย ประเภท (ผู้ส่งข้อความบางส่วน)
4 การใช้ผู้ส่งข้อความ
4.1 ความเข้ากันได้ตั้งข้อสังเกต
5 ตะขอ
5.1 "packet_pre / $ HANDLER_NAME"
5.2 "แพ็คเก็ต / $ HANDLER_NAME"
6 ภาคผนวก A: แนะนำให้รู้จักกับ Ragnarok Online โปรโตคอล
7 ภาคผนวก B: recvpackets.txt และจัดการข้อความ ความยาว
8 ภาคผนวก C: obfuscation ของข้อความที่ส่งออก
8.1 แพ็คเก็ตเบาะ
8.2 รหัสข้อความที่เข้ารหัส
9 ต้นฉบับบทความ
ภาพรวม
OpenKore ระบบย่อยเครือข่ายประมาณประกอบด้วยชั้นเรียนต่อไปนี้:

เครือข่ายระดับ
นี้เป็นผู้จัดการการเชื่อมต่อ จะจัดการทรัพย์สินทางปัญญาเชื่อมต่อ TCP / ซ็อกเก็ตกับเซิร์ฟเวอร์และจัดการกับสิ่งต่างๆเช่นการเชื่อมต่อการเชื่อมต่อการส่งข้อมูลไปยังเซิร์ฟเวอร์ที่ได้รับข้อมูลจากเซิร์ฟเวอร์ ฯลฯ แต่ก็ไม่ได้ทำอะไรอย่างอื่น.

แผนผังก็มีลักษณะเช่นนี้

ไฟล์: เครือข่าย subsystem.jpg

เมื่อเชื่อมต่อกับเซิร์ฟเวอร์จะสร้างวัตถุสอง:

วัตถุข้อความ parser ซึ่งเป็นเครือข่ายระดับ :: :: รับ ServerTypeX เมื่อใดก็ตามที่ได้รับข้อความจากเซิร์ฟเวอร์ข้อความที่ส่งผ่านไปแยกวิเคราะห์ข้อความ.
วัตถุผู้ส่งข้อความ (ไม่ได้เห็นในแผนภาพข้างต้น) ซึ่งเป็นเครือข่ายระดับ :: ส่ง :: ServerTypeX นี้จะใช้สำหรับการส่งข้อความไปยังเซิร์ฟเวอร์.
มีหลายระดับการใช้งานเครือข่าย:. เครือข่าย :: DirectConnection, เครือข่าย :: XKore และเครือข่าย :: XKoreProxy

เครือข่าย :: ระดับ MessageTokenizer
ซึ่งเป็นระดับ tokenizer เป็นสารสกัดจากเซิร์ฟเวอร์หรือลูกค้าที่ไม่ต่อเนื่องข้อความจากกระแส byte ผ่านผู้จัดการการเชื่อมต่อ แต่ก็ไม่ได้ทำอะไรอย่างอื่น.

เครือข่าย :: ระดับ PacketParser
นี้เป็นข้อความที่ชั้นฐาน parser มันจะแยกวิเคราะห์ข้อความผ่านโดยผู้จัดการการเชื่อมต่อเข้ากับข้อมูล hashes ข้อความเช่นเดียวกับการดำเนินการไม่ย้อนกลับ - สร้างข้อความจากแฮชที่มีข้อมูลข้อความ แต่ก็ไม่ได้ทำอะไรอย่างอื่น.

หลังจากนั้นแยกวิเคราะห์ข้อความจะถูกจัดการโดยในตัวรถขนในชั้นเรียนต่อไปและกับตะขอโดยปลั๊กอินหรือโมดูลอื่น ๆ .

นอกจากนี้ยังมี API สำหรับการปรับเปลี่ยนหรือวางข้อความที่จะปรับเปลี่ยนการประมวลผลใด ๆ ต่อไป

เครือข่าย :: รับ, เครือข่าย :: ส่งและเครือข่ายการเรียน :: ClientReceive
มีชั้นเรียนเป็นลูกหลานของเครือข่าย :: ระดับ PacketParser.

เครือข่าย :: รับและเครือข่าย :: ส่งจะแยกวิเคราะห์ชั้นเรียนผู้ช่วย พวกเขามีผู้ช่วยเหลือ parser ซึ่งเป็นวิธีแก้ปัญหาใน absense ของระบบย่อยแยกวิเคราะห์ความสามารถได้.

เครือข่าย :: รับและเครือข่าย :: ClientReceive เรียนจัดการข้อความ พวกเขามีในตัวรถยกสำหรับข้อความมาจากเซิร์ฟเวอร์ (เครือข่าย :: รับ) หรือจากลูกค้า (Network :: ClientReceive) ซึ่งเก็บข้อมูลจากข้อความเครือข่ายเพื่อนำมาใช้ในภายหลังในโมดูลอื่น ๆ (เช่น AI).

เครือข่าย: ส่งเป็นระดับที่ผู้ส่งข้อความ มันห่อหุ้มข้อความเครือข่ายเข้าง่ายฟังก์ชั่นที่ง่ายต่อการใช้งานเพื่อนำไปใช้นอกระบบย่อยเครือข่าย.

ใด class ServerType ลูกหลานสามารถกำหนดจัดการข้อความและผู้ช่วย parser แต่พวกเขาควรละเว้นจากที่อื่นที่ไม่ใช่สำหรับคุณสมบัติ ServerType ที่เฉพาะเจาะจงและการแก้จุดบกพร่อง.

เครือข่าย :: :: รับ ServerTypeX และเครือข่ายการส่ง :: :: ระดับ ServerTypeX
เหล่านี้เป็นคำอธิบาย ServerType ชั้นเรียน พวกเขาอธิบายตัวระบุข้อความเครือข่ายและโครงสร้างสำหรับเซิร์ฟเวอร์ที่แตกต่างกัน . แต่พวกเขาไม่ควรทำอะไรอย่างอื่น

. หมายเหตุ: ไม่มีใครที่จะเรียนเหล่านี้จากการจัดการการเชื่อมต่อไปยังรายละเอียด ServerType ควรมีรหัส AI ใด ๆ

วิธีการทำงานทั้งหมดเข้าด้วยกัน
รหัสเริ่มต้นหลักสร้างตัวอย่างจัดการการเชื่อมต่อและข้อความ tokenizer เช่น:

$ สุทธิ = ใหม่เครือข่าย :: DirectConnection;

$ incomingMessages = เครือข่ายใหม่ :: MessageTokenizer (\% recvpackets);
ผู้จัดการการเชื่อมต่อสร้างอินสแตนซ์แพ็คเก็ต parser:

$ = packetParser เครือข่าย :: Receive-> สร้าง ($ ห่อ $ ServerType);
หลัก ห่วงผ่านข้อมูลจากจัดการการเชื่อมต่อ $ สุทธิข้อความ tokenizer $ incomingMessages:

$ incomingMessages-> เพิ่ม ($ เครือข่าย> serverRecv);
ข้อความ tokenizer กับข้อมูลและจัดการข้อความ $ packetParser จะถูกส่งผ่านไปยังแพ็คเก็ต parser $ packetParser การประมวลผลข้อความที่มีอยู่ทั้งหมด :

@packets = $ packetParser-> กระบวนการ ($ incomingMessages, $ packetParser);

# เปรียบเทียบกับแพ็คเก็ตที่ส่งออก:
# @packets = $ messageSender-> กระบวนการ ($ outgoingClientMessages, $ clientPacketHandler);
แพ็คเก็ตจะถูกส่งผ่านกลับไปจัดการการเชื่อมต่อที่ ผ่านพวกเขาให้กับลูกค้า XKore:

$ เครือข่าย> clientSend ($ _) สำหรับ @packets;
ขณะเดียวกัน parser แพ็คเก็ตที่กำหนดเองเรียก parsers ตะขอและในตัวรถขน:

$ = $ custom_parser ตนเอง> สามารถ ( "parse_ $ handler_name ของฉัน" )
ถ้า ($ custom_parser) {
$ ตนเอง -> $ custom_parser (\% args);
}

ปลั๊กอิน :: callHook ( "packet_pre / $ handler_
การแปล กรุณารอสักครู่..
 
ภาษาอื่น ๆ
การสนับสนุนเครื่องมือแปลภาษา: กรีก, กันนาดา, กาลิเชียน, คลิงออน, คอร์สิกา, คาซัค, คาตาลัน, คินยารวันดา, คีร์กิซ, คุชราต, จอร์เจีย, จีน, จีนดั้งเดิม, ชวา, ชิเชวา, ซามัว, ซีบัวโน, ซุนดา, ซูลู, ญี่ปุ่น, ดัตช์, ตรวจหาภาษา, ตุรกี, ทมิฬ, ทาจิก, ทาทาร์, นอร์เวย์, บอสเนีย, บัลแกเรีย, บาสก์, ปัญจาป, ฝรั่งเศส, พาชตู, ฟริเชียน, ฟินแลนด์, ฟิลิปปินส์, ภาษาอินโดนีเซี, มองโกเลีย, มัลทีส, มาซีโดเนีย, มาราฐี, มาลากาซี, มาลายาลัม, มาเลย์, ม้ง, ยิดดิช, ยูเครน, รัสเซีย, ละติน, ลักเซมเบิร์ก, ลัตเวีย, ลาว, ลิทัวเนีย, สวาฮิลี, สวีเดน, สิงหล, สินธี, สเปน, สโลวัก, สโลวีเนีย, อังกฤษ, อัมฮาริก, อาร์เซอร์ไบจัน, อาร์เมเนีย, อาหรับ, อิกโบ, อิตาลี, อุยกูร์, อุสเบกิสถาน, อูรดู, ฮังการี, ฮัวซา, ฮาวาย, ฮินดี, ฮีบรู, เกลิกสกอต, เกาหลี, เขมร, เคิร์ด, เช็ก, เซอร์เบียน, เซโซโท, เดนมาร์ก, เตลูกู, เติร์กเมน, เนปาล, เบงกอล, เบลารุส, เปอร์เซีย, เมารี, เมียนมา (พม่า), เยอรมัน, เวลส์, เวียดนาม, เอสเปอแรนโต, เอสโทเนีย, เฮติครีโอล, แอฟริกา, แอลเบเนีย, โคซา, โครเอเชีย, โชนา, โซมาลี, โปรตุเกส, โปแลนด์, โยรูบา, โรมาเนีย, โอเดีย (โอริยา), ไทย, ไอซ์แลนด์, ไอร์แลนด์, การแปลภาษา.

Copyright ©2024 I Love Translation. All reserved.

E-mail: