TCP
โมดูลนี้มีฟังก์ชันที่ควบคุมการสื่อสารผ่าน TCP
สรุป
การแจกแจง |
|
|---|---|
anonymous enum
|
enum ระบุแฟล็กที่ส่งไปยัง otTcpConnect() |
anonymous enum
|
enum ระบุแฟล็กที่ส่งไปยัง otTcpSendByReference |
otTcpDisconnectedReason
|
enum |
otTcpIncomingConnectionAction{
|
enum กำหนดการทำงานของการเชื่อมต่อขาเข้า |
Typedef |
|
|---|---|
otLinkedBuffer
|
typedefstruct otLinkedBuffer
โครงสร้างบัฟเฟอร์ที่ลิงก์ไว้สำหรับใช้กับ TCP |
otTcpAcceptDone)(otTcpListener *aListener, otTcpEndpoint *aEndpoint, const otSockAddr *aPeer)
|
typedefvoid(*
โค้ดเรียกกลับนี้บ่งบอกว่าการเชื่อมต่อ TCP พร้อมสำหรับการสื่อสารแบบ 2 ทางแล้ว |
otTcpAcceptReady)(otTcpListener *aListener, const otSockAddr *aPeer, otTcpEndpoint **aAcceptInto)
|
typedef โค้ดเรียกกลับนี้บ่งบอกว่าการเชื่อมต่อขาเข้าที่ตรงกับ Listener TCP นี้มาถึงแล้ว |
otTcpDisconnected)(otTcpEndpoint *aEndpoint, otTcpDisconnectedReason aReason)
|
typedefvoid(*
โค้ดเรียกกลับนี้ระบุว่าการเชื่อมต่อเสียหายและไม่ควรใช้งานอีกต่อไป หรือการเชื่อมต่ออยู่ในสถานะ TIME-WAIT |
otTcpDisconnectedReason
|
typedefenum otTcpDisconnectedReason
|
otTcpEndpoint
|
typedefstruct otTcpEndpoint
|
otTcpEndpointInitializeArgs
|
typedefstruct otTcpEndpointInitializeArgs
มีอาร์กิวเมนต์ในฟังก์ชัน otTcpEndpointInitialize() |
otTcpEstablished)(otTcpEndpoint *aEndpoint)
|
typedefvoid(*
โค้ดเรียกกลับนี้จะแจ้งแอปพลิเคชันว่าแฮนด์เชค 3 ทาง TCP เสร็จสมบูรณ์ และสร้างการเชื่อมต่อแล้ว |
otTcpForwardProgress)(otTcpEndpoint *aEndpoint, size_t aInSendBuffer, size_t aBacklog)
|
typedefvoid(*
โค้ดเรียกกลับนี้จะแจ้งแอปพลิเคชันว่ามีความคืบหน้าในการส่งต่อในการโอนข้อมูลจากบัฟเฟอร์ที่ส่งไปยังผู้รับหรือไม่ |
otTcpIncomingConnectionAction
|
typedef กำหนดการทำงานของการเชื่อมต่อขาเข้า |
otTcpListener
|
typedefstruct otTcpListener
|
otTcpListenerInitializeArgs
|
typedefstruct otTcpListenerInitializeArgs
มีอาร์กิวเมนต์ในฟังก์ชัน otTcpListenerInitialize() |
otTcpReceiveAvailable)(otTcpEndpoint *aEndpoint, size_t aBytesAvailable, bool aEndOfStream, size_t aBytesRemaining)
|
typedefvoid(*
โค้ดเรียกกลับนี้จะระบุจำนวนไบต์ที่พร้อมใช้งานจากบัฟเฟอร์ของการรับ |
otTcpSendDone)(otTcpEndpoint *aEndpoint, otLinkedBuffer *aData)
|
typedefvoid(*
โค้ดเรียกกลับนี้จะแจ้งให้แอปพลิเคชันทราบว่าข้อมูลใน aData ที่ระบุได้รับการยอมรับจากเพียร์การเชื่อมต่อ และแอปพลิเคชันสามารถอ้างสิทธิ์ aData และข้อมูลที่อยู่ในแอปอีกครั้งได้ |
ฟังก์ชัน |
|
|---|---|
otTcpAbort(otTcpEndpoint *aEndpoint)
|
บังคับให้สิ้นสุดการเชื่อมต่อ TCP ที่เชื่อมโยงกับปลายทาง TCP นี้
|
otTcpBind(otTcpEndpoint *aEndpoint, const otSockAddr *aSockName)
|
เชื่อมโยงปลายทาง TCP กับพอร์ตและที่อยู่ IP
|
otTcpCommitReceive(otTcpEndpoint *aEndpoint, size_t aNumBytes, uint32_t aFlags)
|
แจ้งสแต็ก TCP ว่าแอปพลิเคชันประมวลผลข้อมูลขนาด
aNumBytes ไบต์ที่จุดเริ่มบัฟเฟอร์ของการรับแล้ว และสแต็ก TCP ไม่จำเป็นต้องเก็บไบต์เหล่านั้นในบัฟเฟอร์ของการรับ |
otTcpConnect(otTcpEndpoint *aEndpoint, const otSockAddr *aSockName, uint32_t aFlags)
|
บันทึกโฮสต์ระยะไกลและพอร์ตสำหรับการเชื่อมต่อนี้
|
otTcpEndpointDeinitialize(otTcpEndpoint *aEndpoint)
|
ยกเลิกการเริ่มต้นปลายทาง TCP นี้
|
otTcpEndpointGetContext(otTcpEndpoint *aEndpoint)
|
void *
รับตัวชี้บริบทที่เชื่อมโยงกับ
aEndpoint เมื่อเริ่มต้น |
otTcpEndpointGetInstance(otTcpEndpoint *aEndpoint)
|
รับ otInstance ที่เชื่อมโยงกับ
aEndpoint เมื่อเริ่มต้น |
otTcpEndpointInitialize(otInstance *aInstance, otTcpEndpoint *aEndpoint, const otTcpEndpointInitializeArgs *aArgs)
|
เริ่มต้นปลายทาง TCP
|
otTcpGetLocalAddress(const otTcpEndpoint *aEndpoint)
|
const otSockAddr *
รับตัวชี้ไปยังโฮสต์และพอร์ตในเครื่องของปลายทาง TCP
|
otTcpGetPeerAddress(const otTcpEndpoint *aEndpoint)
|
const otSockAddr *
รับตัวชี้ไปยังโฮสต์และพอร์ตของเพียร์ปลายทาง TCP
|
otTcpListen(otTcpListener *aListener, const otSockAddr *aSockName)
|
ทำให้การเชื่อมต่อ TCP ขาเข้าที่ตรงกับที่อยู่ IP และพอร์ตที่ระบุทริกเกอร์การเรียกกลับของ Listener ของ TCP นี้
|
otTcpListenerDeinitialize(otTcpListener *aListener)
|
ยกเลิกการเริ่มต้น Listener ของ TCP นี้
|
otTcpListenerGetContext(otTcpListener *aListener)
|
void *
รับตัวชี้บริบทที่เชื่อมโยงกับ
aListener เมื่อเริ่มต้น |
otTcpListenerGetInstance(otTcpListener *aListener)
|
รับ otInstance ที่เชื่อมโยงกับ
aListener เมื่อเริ่มต้น |
otTcpListenerInitialize(otInstance *aInstance, otTcpListener *aListener, const otTcpListenerInitializeArgs *aArgs)
|
เริ่มต้น Listener ของ TCP
|
otTcpReceiveByReference(otTcpEndpoint *aEndpoint, const otLinkedBuffer **aBuffer)
|
จัดเตรียมแอปพลิเคชันด้วยห่วงโซ่บัฟเฟอร์ที่ลิงก์โดยอ้างอิงข้อมูลที่อยู่ในบัฟเฟอร์เพื่อรับ TCP
|
otTcpReceiveContiguify(otTcpEndpoint *aEndpoint)
|
จัดระเบียบบัฟเฟอร์ที่ได้รับใหม่ให้ต่อเนื่องกันในหน่วยความจำ
|
otTcpSendByExtension(otTcpEndpoint *aEndpoint, size_t aNumBytes, uint32_t aFlags)
|
เพิ่มข้อมูลลงในบัฟเฟอร์การส่งโดยขยายความยาวของ otLinkedBuffer สุดท้ายในบัฟเฟอร์ที่ส่งตามจำนวนที่ระบุ
|
otTcpSendByReference(otTcpEndpoint *aEndpoint, otLinkedBuffer *aBuffer, uint32_t aFlags)
|
เพิ่มข้อมูลที่อ้างอิงโดยบัฟเฟอร์ที่ลิงก์ซึ่งชี้โดย
aBuffer ไปยังบัฟเฟอร์ที่ส่ง |
otTcpSendEndOfStream(otTcpEndpoint *aEndpoint)
|
แจ้งเพียร์การเชื่อมต่อว่าปลายทาง TCP นี้จะไม่ส่งข้อมูลเพิ่มเติม
|
otTcpStopListening(otTcpListener *aListener)
|
ทำให้ Listener TCP นี้หยุดฟังการเชื่อมต่อขาเข้า
|
โครงสร้าง |
|
|---|---|
| otLinkedBuffer |
โครงสร้างบัฟเฟอร์ที่ลิงก์ไว้สำหรับใช้กับ TCP |
| otTcpEndpoint |
แสดงปลายทาง TCP |
| otTcpEndpointInitializeArgs |
มีอาร์กิวเมนต์ในฟังก์ชัน otTcpEndpointInitialize() |
| otTcpListener |
แสดง Listener ของ TCP |
| otTcpListenerInitializeArgs |
มีอาร์กิวเมนต์ในฟังก์ชัน otTcpListenerInitialize() |
การแจกแจง
enum ที่ไม่ระบุตัวตน
anonymous enum
ระบุแฟล็กที่ส่งไปยัง otTcpSendByReference
otTcpDisconnectedReason
otTcpDisconnectedReason
otTcpIncomingConnectionAction
otTcpIncomingConnectionAction
กำหนดการทำงานของการเชื่อมต่อขาเข้า
ซึ่งจะใช้ในโค้ดเรียกกลับ otTcpAcceptReady()
| พร็อพเพอร์ตี้ | |
|---|---|
OT_TCP_INCOMING_CONNECTION_ACTION_ACCEPT
|
ยอมรับการเชื่อมต่อขาเข้า |
OT_TCP_INCOMING_CONNECTION_ACTION_DEFER
|
เลื่อนการเชื่อมต่อขาเข้า (ไม่ต้องสนใจ) |
OT_TCP_INCOMING_CONNECTION_ACTION_REFUSE
|
ปฏิเสธการเชื่อมต่อขาเข้า |
Typedef
otLinkedBuffer
struct otLinkedBuffer otLinkedBuffer
โครงสร้างบัฟเฟอร์ที่ลิงก์ไว้สำหรับใช้กับ TCP
โครงสร้าง otLinkedBuffer เดียวอ้างอิงอาร์เรย์ของไบต์ในหน่วยความจำผ่าน mData และ mLength ช่อง mNext จะใช้ในการสร้างเชนโครงสร้าง otLinkedBuffer
otTcpAcceptDone
void(* otTcpAcceptDone)(otTcpListener *aListener, otTcpEndpoint *aEndpoint, const otSockAddr *aPeer)
โค้ดเรียกกลับนี้บ่งบอกว่าการเชื่อมต่อ TCP พร้อมสำหรับการสื่อสารแบบ 2 ทางแล้ว
ในกรณีของ TCP Fast Open นี่อาจจะเกิดขึ้นก่อนที่แฮนด์เชคการเชื่อมต่อ TCP จะเสร็จสมบูรณ์ แอปพลิเคชันมาพร้อมกับตัวชี้บริบททั้งสำหรับ Listener TCP ที่ยอมรับการเชื่อมต่อและปลายทาง TCP ที่ยอมรับ บริบทที่ให้ไว้คือบริบทที่เชื่อมโยงกับ Listener ของ TCP
| รายละเอียด | |||||||
|---|---|---|---|---|---|---|---|
| พารามิเตอร์ |
|
||||||
otTcpAcceptReady
otTcpIncomingConnectionAction(* otTcpAcceptReady)(otTcpListener *aListener, const otSockAddr *aPeer, otTcpEndpoint **aAcceptInto)
โค้ดเรียกกลับนี้บ่งบอกว่าการเชื่อมต่อขาเข้าที่ตรงกับ Listener TCP นี้มาถึงแล้ว
การตอบสนองทั่วไปคือการให้แอปพลิเคชันยอมรับการเชื่อมต่อขาเข้า ซึ่งทำได้โดยการป้อนข้อมูล aAcceptInto ด้วยตัวชี้ที่ otTcpEndpoint เพื่อยอมรับการเชื่อมต่อขาเข้า otTcpEndpoint ต้องเริ่มต้นโดยใช้ otTcpEndpointInitialize() จากนั้นแอปพลิเคชันจะแสดงผล OT_TCP_INCOMING_CONNECTION_ACTION_ACCEPT
หรือแอปพลิเคชันสามารถปฏิเสธที่จะยอมรับการเชื่อมต่อขาเข้า แอปพลิเคชันจะดำเนินการได้ 2 วิธี ก่อนอื่น หากแอปพลิเคชันส่งคืน OT_TCP_INCOMING_CONNECTION_ACTION_DEFER จากนั้น OpenThread จะเพิกเฉยต่อคำขอสร้างการเชื่อมต่อโดยไม่มีการแจ้งเตือน การเพียร์การเชื่อมต่อมีแนวโน้มที่จะส่งคำขออีกครั้ง ซึ่งในเวลานั้นจะมีการเรียกใช้โค้ดเรียกกลับอีกครั้ง ซึ่งจะมีประโยชน์หากทรัพยากรไม่พร้อมให้ยอมรับการเชื่อมต่อในขณะนี้ แต่อาจใช้ได้เมื่อเพียร์ส่งการเชื่อมต่ออีกครั้ง อันดับที่สอง หากแอปพลิเคชันแสดงผล OT_TCP_INCOMING_CONNECTION_ACTION_REFUSE แล้ว OpenThread จะส่งข้อความ "ถูกปฏิเสธการเชื่อมต่อ" ไปยังโฮสต์ที่พยายามจะสร้างการเชื่อมต่อ หากแอปพลิเคชันปฏิเสธการเชื่อมต่อขาเข้า ก็ไม่จำเป็นต้องป้อนข้อมูล aAcceptInto
| รายละเอียด | |||||||
|---|---|---|---|---|---|---|---|
| พารามิเตอร์ |
|
||||||
| การส่งคืน |
คำอธิบายวิธีจัดการการเชื่อมต่อขาเข้า
|
||||||
otTcpDisconnected
void(* otTcpDisconnected)(otTcpEndpoint *aEndpoint, otTcpDisconnectedReason aReason)
โค้ดเรียกกลับนี้ระบุว่าการเชื่อมต่อเสียหายและไม่ควรใช้งานอีกต่อไป หรือการเชื่อมต่ออยู่ในสถานะ TIME-WAIT
ข้อผิดพลาดนี้อาจเกิดขึ้นเมื่อการสร้างการเชื่อมต่อ (เริ่มโดยการเรียกใช้ otTcpConnect()) ล้มเหลวหรือจุดใดก็ตามหลังจากนั้น (เช่น ในกรณีที่การเชื่อมต่อหมดเวลาหรือได้รับกลุ่ม RST จากเพียร์การเชื่อมต่อ) เมื่อโค้ดเรียกกลับเริ่มทำงาน ทรัพยากรทั้งหมดที่แอปพลิเคชันมีให้สำหรับการเชื่อมต่อนี้ (กล่าวคือ otLinkedBuffers และหน่วยความจำที่อ้างอิง แต่ไม่ใช่ปลายทาง TCP หรือพื้นที่สำหรับบัฟเฟอร์ที่ได้รับ) จะสามารถเรียกคืนได้ ในกรณีที่การเชื่อมต่อเข้าสู่สถานะ TIME-WAIT จะมีการเรียกกลับ 2 ครั้ง โดยครั้งแรกเมื่อเข้าสู่สถานะ TIME-WAIT (โดยมี OT_TCP_DISCONNECTED_REASON_TIME_WAIT และอีกครั้งเมื่อสถานะ TIME-WAIT หมดอายุ (โดยมี OT_TCP_DISCONNECTED_REASON_NORMAL)
| รายละเอียด | |||||
|---|---|---|---|---|---|
| พารามิเตอร์ |
|
||||
otTcpDisconnectedReason
enum otTcpDisconnectedReason otTcpDisconnectedReason
otTcpEndpoint
struct otTcpEndpoint otTcpEndpoint
otTcpEndpointInitializeArgs
struct otTcpEndpointInitializeArgs otTcpEndpointInitializeArgs
มีอาร์กิวเมนต์ในฟังก์ชัน otTcpEndpointInitialize()
otTcpEstablished
void(* otTcpEstablished)(otTcpEndpoint *aEndpoint)
โค้ดเรียกกลับนี้จะแจ้งแอปพลิเคชันว่าแฮนด์เชค 3 ทาง TCP เสร็จสมบูรณ์ และสร้างการเชื่อมต่อแล้ว
| รายละเอียด | |||
|---|---|---|---|
| พารามิเตอร์ |
|
||
otTcpForwardProgress
void(* otTcpForwardProgress)(otTcpEndpoint *aEndpoint, size_t aInSendBuffer, size_t aBacklog)
โค้ดเรียกกลับนี้จะแจ้งแอปพลิเคชันว่ามีความคืบหน้าในการส่งต่อในการโอนข้อมูลจากบัฟเฟอร์ที่ส่งไปยังผู้รับหรือไม่
ไม่จำเป็นต้องเรียกกลับนี้สำหรับการทำงาน TCP ที่ถูกต้อง แอปพลิเคชันส่วนใหญ่จะใช้เพียงโค้ดเรียกกลับ otTcpSendDone() เพื่ออ้างสิทธิ์บัฟเฟอร์ที่ลิงก์อีกครั้งเมื่อสแต็ก TCP ใช้งานได้เสร็จแล้ว วัตถุประสงค์ของโค้ดเรียกกลับนี้คือการรองรับแอปพลิเคชันขั้นสูงที่ได้ประโยชน์จากข้อมูลโดยละเอียดเกี่ยวกับวิธีที่การเชื่อมต่อมีความคืบหน้าในการโอนข้อมูลไปยังเพียร์การเชื่อมต่อ
การดำเนินการของโค้ดเรียกกลับนี้เชื่อมโยงอย่างใกล้ชิดกับบัฟเฟอร์การส่งของ TCP ซึ่งบัฟเฟอร์ที่ส่งจะมี 2 ภูมิภาค อย่างแรกคือ ภูมิภาค "กำลังบิน" อยู่ตรงหัว (ด้านหน้า) ของบัฟเฟอร์การส่ง ซึ่งสอดคล้องกับข้อมูลที่ส่งไปยังผู้รับแล้ว แต่ยังไม่ได้รับทราบ ประการที่สองคือภูมิภาค " Backlog" ซึ่งประกอบด้วยข้อมูลทั้งหมดในบัฟเฟอร์การส่งที่ไม่ได้อยู่ในภูมิภาค "กำลังบิน" ภูมิภาค " Backlog" จะสอดคล้องกับข้อมูลที่รออยู่ในคิวสำหรับส่ง แต่ยังไม่ได้ส่ง
มีการเรียกกลับเพื่อตอบสนองต่อเหตุการณ์ 2 ประเภท อย่างแรก พื้นที่ "ขณะทำงาน" ของบัฟเฟอร์ที่ส่งอาจลดขนาดลง (เช่น เมื่อผู้รับรับทราบข้อมูลที่เราส่งไปก่อนหน้า) ประการที่ 2 พื้นที่ "ค้าง" ของบัฟเฟอร์ที่ส่งอาจหดตัวลง (เช่น มีการส่งข้อมูลใหม่) ทั้ง 2 เงื่อนไขนี้มักเกิดขึ้นพร้อมกันเพื่อตอบสนองกลุ่ม ACK จากเพียร์การเชื่อมต่อ ซึ่งเป็นสาเหตุที่ระบบรวมเงื่อนไขเหล่านี้ไว้ในโค้ดเรียกกลับเดียว
สแต็ก TCP จะใช้เพียง aInSendBuffer ไบต์ที่ด้านท้ายของบัฟเฟอร์ที่ส่ง เมื่อ aInSendBuffer ลดลงเป็นจำนวน x หมายความว่าไบต์เพิ่มเติม x ไบต์ที่เคยอยู่ที่ส่วนหัวของบัฟเฟอร์ที่ส่งจะไม่เป็นส่วนหนึ่งของบัฟเฟอร์การส่งอีกต่อไป และตอนนี้แอปสามารถอ้างสิทธิ์ใหม่ได้ (เช่น เขียนทับ) โปรดทราบว่าคุณสามารถอ้างสิทธิ์โครงสร้าง otLinkedBuffer คืนได้ก็ต่อเมื่อไบต์ทั้งหมดที่มีการอ้างอิงไม่ได้เป็นส่วนหนึ่งของบัฟเฟอร์การส่งอีกต่อไปแล้ว
โค้ดเรียกกลับนี้ใช้ย่อยของ otTcpSendDone() ในความหมายต่อไปนี้ แอปพลิเคชันสามารถระบุได้ว่าจะอ้างสิทธิ์บัฟเฟอร์ที่ลิงก์อีกครั้งเมื่อใดโดยเปรียบเทียบ aInSendBuffer กับจำนวนไบต์ที่อยู่ในบัฟเฟอร์ที่ลิงก์แต่ละรายการ อย่างไรก็ตาม เราคาดหวังให้ otTcpSendDone() ซึ่งสื่อสารโดยตรงว่า otLinkedBuffers ไหนนำมาใช้ใหม่ได้เพื่อให้ใช้งานง่ายขึ้นมาก หากมีการลงทะเบียนโค้ดเรียกกลับทั้ง 2 รายการและทริกเกอร์โดยเหตุการณ์เดียวกัน (เช่น ได้รับกลุ่ม ACK เดียวกัน) ระบบจะทริกเกอร์โค้ดเรียกกลับ otTcpSendDone() ก่อน ตามด้วยโค้ดเรียกกลับนี้
นอกจากนี้ โค้ดเรียกกลับนี้จะให้ข้อมูล aBacklog ซึ่งบอกจํานวนไบต์ในบัฟเฟอร์ที่ส่งที่ยังไม่ได้ดําเนินการ สำหรับแอปพลิเคชันที่ต้องการเพิ่มข้อมูลไปยังบัฟเฟอร์การส่งเมื่อมั่นใจว่าระบบจะส่งออกในเร็วๆ นี้เท่านั้น คุณควรส่งข้อมูลออกเฉพาะในกรณีที่ aBacklog มีขนาดเล็กที่เหมาะสม (0 หรือเกือบถึง 0) ตัวอย่างเช่น แอปพลิเคชันอาจใช้ aBacklog เพื่อให้สามารถตอบสนองต่อคิวการสร้างคิวโดยการทิ้งหรือรวมข้อมูลเพื่อหลีกเลี่ยงการสร้างรายการค้างของข้อมูล
หลังจากเรียก otTcpSendByReference() หรือ otTcpSendByExtension() เป็นจำนวนไบต์บวก ก็รับประกันได้เลยว่าจะมีการเรียกกลับ otTcpForwardProgress() เพื่อระบุเวลาที่เพิ่มไบต์ที่เพิ่มลงในบัฟเฟอร์การส่ง การเรียกใช้ otTcpForwardProgress() อาจทำขึ้นทันทีหลังจากมีการเพิ่มไบต์ลงในบัฟเฟอร์การส่ง (หากไบต์เหล่านั้นบางส่วนมีการส่งออกไปทันที ซึ่งเป็นการลดรายการงานที่ยังทำไม่เสร็จ) หรือในบางครั้งในอนาคต (เมื่อการเชื่อมต่อส่งข้อมูลบางส่วนหรือทั้งหมดออกไป จึงลด Backlog) "ในทันที" หมายความว่าจะมีการตั้งเวลาการเรียกกลับทันทีสำหรับการดำเนินการใน Tasklet เพื่อหลีกเลี่ยงความซับซ้อนที่เกี่ยวข้องกับการทำซ้ำ โค้ดเรียกกลับ otTcpForwardProgress() จะไม่ถูกเรียกจากฟังก์ชัน otTcpSendByReference() หรือ otTcpSendByExtension() โดยตรง
| รายละเอียด | |||||||
|---|---|---|---|---|---|---|---|
| พารามิเตอร์ |
|
||||||
otTcpIncomingConnectionAction
enum otTcpIncomingConnectionAction otTcpIncomingConnectionAction
กำหนดการทำงานของการเชื่อมต่อขาเข้า
ซึ่งจะใช้ในโค้ดเรียกกลับ otTcpAcceptReady()
otTcpListener
struct otTcpListener otTcpListener
otTcpListenerInitializeArgs
struct otTcpListenerInitializeArgs otTcpListenerInitializeArgs
มีอาร์กิวเมนต์ในฟังก์ชัน otTcpListenerInitialize()
otTcpReceiveAvailable
void(* otTcpReceiveAvailable)(otTcpEndpoint *aEndpoint, size_t aBytesAvailable, bool aEndOfStream, size_t aBytesRemaining)
โค้ดเรียกกลับนี้จะระบุจำนวนไบต์ที่พร้อมใช้งานจากบัฟเฟอร์ของการรับ
ระบบจะเรียกใช้เมื่อใดก็ตามที่มีการเพิ่มไบต์ลงในบัฟเฟอร์ของการรับและเมื่อถึงขีดจำกัดของสตรีม หากถึงจุดสิ้นสุดของสตรีมแล้ว (เช่น หากไม่มีข้อมูลให้อ่านอีกเนื่องจากการเพียร์ปิดการสิ้นสุดการเชื่อมต่อเพื่อเขียน) aEndOfStream จะเป็น True สุดท้าย aBytesRemaining จะแสดงความจุที่เหลืออยู่ในบัฟเฟอร์ที่รับข้อมูลเพื่อใช้เก็บข้อมูลเพิ่มเติมที่เข้ามา
| รายละเอียด | |||||||||
|---|---|---|---|---|---|---|---|---|---|
| พารามิเตอร์ |
|
||||||||
otTcpSendDone
void(* otTcpSendDone)(otTcpEndpoint *aEndpoint, otLinkedBuffer *aData)
โค้ดเรียกกลับนี้จะแจ้งให้แอปพลิเคชันทราบว่าข้อมูลใน aData ที่ระบุได้รับการยอมรับจากเพียร์การเชื่อมต่อ และแอปพลิเคชันสามารถอ้างสิทธิ์ aData และข้อมูลที่อยู่ในแอปอีกครั้งได้
เรารับประกันว่า aData จะเหมือนกับเวอร์ชันที่ส่งไปยัง TCP ผ่าน otTcpSendByReference() รวมถึงส่วนขยายที่ส่งผลผ่าน otTcpSendByExtension()
| รายละเอียด | |||||
|---|---|---|---|---|---|
| พารามิเตอร์ |
|
||||
ฟังก์ชัน
otTcpAbort
otError otTcpAbort( otTcpEndpoint *aEndpoint )
บังคับให้สิ้นสุดการเชื่อมต่อ TCP ที่เชื่อมโยงกับปลายทาง TCP นี้
การดำเนินการนี้จะทำให้ปลายทาง TCP ใช้งานได้ฟรีสำหรับการเชื่อมต่ออื่นทันที และจะล้างการส่งและรับบัฟเฟอร์ ซึ่งเป็นการโอนความเป็นเจ้าของข้อมูลใดๆ ที่แอปพลิเคชันให้ไว้ใน otTcpSendByReference() และ otTcpSendByExtension() เรียกกลับไปยังแอปพลิเคชัน โค้ดเรียกกลับและหน่วยความจำของปลายทาง TCP สำหรับบัฟเฟอร์ที่ได้รับจะยังคงเชื่อมโยงกับปลายทาง TCP
| รายละเอียด | |||||
|---|---|---|---|---|---|
| พารามิเตอร์ |
|
||||
| แสดงผลค่า |
|
||||
otTcpBind
otError otTcpBind( otTcpEndpoint *aEndpoint, const otSockAddr *aSockName )
เชื่อมโยงปลายทาง TCP กับพอร์ตและที่อยู่ IP
| รายละเอียด | |||||
|---|---|---|---|---|---|
| พารามิเตอร์ |
|
||||
| แสดงผลค่า |
|
||||
otTcpCommitReceive
otError otTcpCommitReceive( otTcpEndpoint *aEndpoint, size_t aNumBytes, uint32_t aFlags )
แจ้งสแต็ก TCP ว่าแอปพลิเคชันประมวลผลข้อมูลขนาด aNumBytes ไบต์ที่จุดเริ่มบัฟเฟอร์ของการรับแล้ว และสแต็ก TCP ไม่จำเป็นต้องเก็บไบต์เหล่านั้นในบัฟเฟอร์ของการรับ
| รายละเอียด | |||||||
|---|---|---|---|---|---|---|---|
| พารามิเตอร์ |
|
||||||
| แสดงผลค่า |
|
||||||
otTcpConnect
otError otTcpConnect( otTcpEndpoint *aEndpoint, const otSockAddr *aSockName, uint32_t aFlags )
บันทึกโฮสต์ระยะไกลและพอร์ตสำหรับการเชื่อมต่อนี้
ต้องเปิดหรือปิดใช้ TCP แบบเร็วโดยใช้ aFlags หากปิดใช้ แฮนด์เชคการสร้างการเชื่อมต่อ TCP จะเริ่มต้นทันที หากเปิดใช้ ฟังก์ชันนี้จะบันทึกโฮสต์และพอร์ตระยะไกลเท่านั้น แฮนด์เชคของการสร้างการเชื่อมต่อ TCP จะเกิดขึ้นในการเรียก otTcpSendByReference() ครั้งแรกเท่านั้น
หากปิดใช้ TCP Fast Open อยู่ ผู้โทรจะต้องรอให้การโทรกลับของ otTcpEstablished ซึ่งระบุว่าแฮนด์เชคการเชื่อมต่อ TCP เสร็จสิ้นก่อน จึงจะสามารถเริ่มส่งข้อมูลได้ เช่น โดยการโทรหา otTcpSendByReference()
| รายละเอียด | |||||||
|---|---|---|---|---|---|---|---|
| พารามิเตอร์ |
|
||||||
| แสดงผลค่า |
|
||||||
otTcpEndpointDeinitialize
otError otTcpEndpointDeinitialize( otTcpEndpoint *aEndpoint )
ยกเลิกการเริ่มต้นปลายทาง TCP นี้
ซึ่งหมายความว่า OpenThread จะไม่ติดตามปลายทาง TCP นี้และจัดการกับทรัพยากรทั้งหมดที่จัดสรรไว้ภายในสำหรับปลายทาง TCP นี้ แอปพลิเคชันสามารถนำหน่วยความจำสำรองปลายทาง TCP มาใช้ซ้ำตามความเหมาะสม
หากสอดคล้องกับการเชื่อมต่อ TCP แบบสด การเชื่อมต่อจะยุติลงโดยไม่เจตนา (เช่น otTcpAbort()) ทรัพยากรทั้งหมดที่แอปพลิเคชันให้ไว้สำหรับปลายทาง TCP นี้ (บัฟเฟอร์ลิงก์ของบัฟเฟอร์ที่ส่ง หน่วยความจำสำหรับบัฟเฟอร์ที่ได้รับ หรือโครงสร้าง aEndpoint เอง) จะถูกส่งกลับไปยังแอปพลิเคชันทันที
| รายละเอียด | |||||
|---|---|---|---|---|---|
| พารามิเตอร์ |
|
||||
| แสดงผลค่า |
|
||||
otTcpEndpointGetContext
void * otTcpEndpointGetContext( otTcpEndpoint *aEndpoint )
รับตัวชี้บริบทที่เชื่อมโยงกับ aEndpoint เมื่อเริ่มต้น
| รายละเอียด | |||
|---|---|---|---|
| พารามิเตอร์ |
|
||
| การส่งคืน |
ตัวชี้บริบทที่เชื่อมโยงกับ
aEndpoint |
||
otTcpEndpointGetInstance
otInstance * otTcpEndpointGetInstance( otTcpEndpoint *aEndpoint )
รับ otInstance ที่เชื่อมโยงกับ aEndpoint เมื่อเริ่มต้น
| รายละเอียด | |||
|---|---|---|---|
| พารามิเตอร์ |
|
||
| การส่งคืน |
ตัวชี้ otInstance ที่เชื่อมโยงกับ
aEndpoint |
||
otTcpEndpointInitialize
otError otTcpEndpointInitialize( otInstance *aInstance, otTcpEndpoint *aEndpoint, const otTcpEndpointInitializeArgs *aArgs )
เริ่มต้นปลายทาง TCP
การเรียกฟังก์ชันนี้ทำให้ OpenThread จะติดตามปลายทาง TCP รวมถึงจัดเก็บและเรียกข้อมูล TCP ภายใน aEndpoint แอปพลิเคชันไม่ควรเข้าถึงหรือแก้ไขช่องใน aEndpoint โดยตรง หากแอปพลิเคชันต้องเรียกคืนหน่วยความจำสำรอง aEndpoint แอปพลิเคชันควรเรียกใช้ otTcpEndpointDeinitialize()
| รายละเอียด | |||||||
|---|---|---|---|---|---|---|---|
| พารามิเตอร์ |
|
||||||
| แสดงผลค่า |
|
||||||
otTcpGetLocalAddress
const otSockAddr * otTcpGetLocalAddress( const otTcpEndpoint *aEndpoint )
รับตัวชี้ไปยังโฮสต์และพอร์ตในเครื่องของปลายทาง TCP
เนื้อหาของโฮสต์และพอร์ตอาจไม่อัปเดตหากซ็อกเก็ตนี้ไม่อยู่ในสถานะเชื่อมต่อและไม่มีการเชื่อมโยงหลังจากการเชื่อมต่อครั้งล่าสุด
| รายละเอียด | |||
|---|---|---|---|
| พารามิเตอร์ |
|
||
| การส่งคืน |
โฮสต์ในเครื่องและพอร์ตของ
aEndpoint |
||
otTcpGetPeerAddress
const otSockAddr * otTcpGetPeerAddress( const otTcpEndpoint *aEndpoint )
รับตัวชี้ไปยังโฮสต์และพอร์ตของเพียร์ปลายทาง TCP
เนื้อหาของโฮสต์และพอร์ตอาจไม่อัปเดตหากซ็อกเก็ตนี้ไม่อยู่ในสถานะเชื่อมต่อ
| รายละเอียด | |||
|---|---|---|---|
| พารามิเตอร์ |
|
||
| การส่งคืน |
โฮสต์และพอร์ตของเพียร์การเชื่อมต่อของ
aEndpoint |
||
otTcpListen
otError otTcpListen( otTcpListener *aListener, const otSockAddr *aSockName )
ทำให้การเชื่อมต่อ TCP ขาเข้าที่ตรงกับที่อยู่ IP และพอร์ตที่ระบุทริกเกอร์การเรียกกลับของ Listener ของ TCP นี้
| รายละเอียด | |||||
|---|---|---|---|---|---|
| พารามิเตอร์ |
|
||||
| แสดงผลค่า |
|
||||
otTcpListenerDeinitialize
otError otTcpListenerDeinitialize( otTcpListener *aListener )
ยกเลิกการเริ่มต้น Listener ของ TCP นี้
ซึ่งหมายความว่า OpenThread จะไม่ติดตาม Listener ของ TCP นี้อีกต่อไป และจัดสรรทรัพยากรทั้งหมดที่จัดสรรไว้เป็นการภายในสำหรับ Listener TCP นี้ แอปพลิเคชันสามารถใช้หน่วยความจำสำรอง Listener ของ TCP ซ้ำตามความเหมาะสม
หาก Listener ของ TCP กำลังฟังอยู่ ตัวฟังนั้นจะหยุดฟัง
| รายละเอียด | |||||
|---|---|---|---|---|---|
| พารามิเตอร์ |
|
||||
| แสดงผลค่า |
|
||||
otTcpListenerGetContext
void * otTcpListenerGetContext( otTcpListener *aListener )
รับตัวชี้บริบทที่เชื่อมโยงกับ aListener เมื่อเริ่มต้น
| รายละเอียด | |||
|---|---|---|---|
| พารามิเตอร์ |
|
||
| การส่งคืน |
ตัวชี้บริบทที่เชื่อมโยงกับ
aListener |
||
otTcpListenerGetInstance
otInstance * otTcpListenerGetInstance( otTcpListener *aListener )
รับ otInstance ที่เชื่อมโยงกับ aListener เมื่อเริ่มต้น
| รายละเอียด | |||
|---|---|---|---|
| พารามิเตอร์ |
|
||
| การส่งคืน |
ตัวชี้ otInstance ที่เชื่อมโยงกับ
aListener |
||
otTcpListenerInitialize
otError otTcpListenerInitialize( otInstance *aInstance, otTcpListener *aListener, const otTcpListenerInitializeArgs *aArgs )
เริ่มต้น Listener ของ TCP
การเรียกฟังก์ชันนี้ทำให้ OpenThread จะติดตาม Listener ของ TCP รวมถึงจัดเก็บและเรียกข้อมูล TCP ภายใน aListener แอปพลิเคชันไม่ควรเข้าถึงหรือแก้ไขช่องใน aListener โดยตรง หากแอปพลิเคชันต้องเรียกคืนหน่วยความจำสำรอง aListener แอปพลิเคชันควรเรียก otTcpListenerDeinitialize()
| รายละเอียด | |||||||
|---|---|---|---|---|---|---|---|
| พารามิเตอร์ |
|
||||||
| แสดงผลค่า |
|
||||||
otTcpReceiveByReference
otError otTcpReceiveByReference( otTcpEndpoint *aEndpoint, const otLinkedBuffer **aBuffer )
จัดเตรียมแอปพลิเคชันด้วยห่วงโซ่บัฟเฟอร์ที่ลิงก์โดยอ้างอิงข้อมูลที่อยู่ในบัฟเฟอร์เพื่อรับ TCP
ห่วงโซ่บัฟเฟอร์ที่ลิงก์จะใช้ได้จนกว่าจะมีการเรียกใช้การเรียกกลับ "รับพร้อม" ครั้งถัดไป หรือจนกว่าจะมีการเรียกไปยัง otTcpReceiveContiguify() หรือ otTcpCommitReceive() ครั้งถัดไป
| รายละเอียด | |||||
|---|---|---|---|---|---|
| พารามิเตอร์ |
|
||||
| แสดงผลค่า |
|
||||
otTcpReceiveContiguify
otError otTcpReceiveContiguify( otTcpEndpoint *aEndpoint )
จัดระเบียบบัฟเฟอร์ที่ได้รับใหม่ให้ต่อเนื่องกันในหน่วยความจำ
วิธีนี้เป็นขั้นตอนที่ไม่บังคับ แอปพลิเคชันสามารถข้ามผ่านห่วงโซ่บัฟเฟอร์ที่ลิงก์ไว้ซึ่งมาจากการเรียกใช้ otTcpReceiveByReference แอปพลิเคชันบางรายการอาจต้องการเรียกใช้ฟังก์ชันนี้เพื่อให้บัฟเฟอร์ที่ได้รับต่อเนื่องกันเพื่อลดความซับซ้อนในการประมวลผลข้อมูล แต่จะต้องลดเวลา CPU ในการจัดระเบียบข้อมูลในบัฟเฟอร์ที่ได้รับใหม่
| รายละเอียด | |||||
|---|---|---|---|---|---|
| พารามิเตอร์ |
|
||||
| แสดงผลค่า |
|
||||
otTcpSendByExtension
otError otTcpSendByExtension( otTcpEndpoint *aEndpoint, size_t aNumBytes, uint32_t aFlags )
เพิ่มข้อมูลลงในบัฟเฟอร์การส่งโดยขยายความยาวของ otLinkedBuffer สุดท้ายในบัฟเฟอร์ที่ส่งตามจำนวนที่ระบุ
หากบัฟเฟอร์ที่ส่งว่างเปล่า แสดงว่าการดำเนินการล้มเหลว
| รายละเอียด | |||||||
|---|---|---|---|---|---|---|---|
| พารามิเตอร์ |
|
||||||
| แสดงผลค่า |
|
||||||
otTcpSendByReference
otError otTcpSendByReference( otTcpEndpoint *aEndpoint, otLinkedBuffer *aBuffer, uint32_t aFlags )
เพิ่มข้อมูลที่อ้างอิงโดยบัฟเฟอร์ที่ลิงก์ซึ่งชี้โดย aBuffer ไปยังบัฟเฟอร์ที่ส่ง
เมื่อเรียกฟังก์ชันนี้สำเร็จ บัฟเฟอร์และข้อมูลที่ลิงก์ซึ่งสแต็ก TCP จะเป็นของสแต็ก TCP และไม่ควรแก้ไขโดยแอปพลิเคชันจนกว่าโค้ดเรียกกลับ "ส่งเสร็จสิ้น" จะส่งการเป็นเจ้าของออบเจ็กต์เหล่านั้นไปยังแอปพลิเคชัน คุณสามารถเรียกฟังก์ชันนี้เพื่อเพิ่มบัฟเฟอร์ที่ลิงก์ไปยังคิวการส่งได้ แม้ว่าการเรียกกลับ "ส่งเสร็จสิ้น" สำหรับการเรียกใช้ฟังก์ชันนี้ก่อนหน้าจะยังไม่เริ่มทํางานก็ตาม
โปรดทราบว่าไม่ควรเชื่อมโยง aBuffer และช่อง mNext ควรเป็น NULL หากจะมีการเพิ่มข้อมูลเพิ่มเติมทันทีหลังจากการโทรนี้ ควรใช้แฟล็ก OT_TCP_SEND_MORE_TO_COME เป็นสัญญาณบอกใบ้การติดตั้งใช้งาน TCP
| รายละเอียด | |||||||
|---|---|---|---|---|---|---|---|
| พารามิเตอร์ |
|
||||||
| แสดงผลค่า |
|
||||||
otTcpSendEndOfStream
otError otTcpSendEndOfStream( otTcpEndpoint *aEndpoint )
แจ้งเพียร์การเชื่อมต่อว่าปลายทาง TCP นี้จะไม่ส่งข้อมูลเพิ่มเติม
ควรใช้เมื่อแอปพลิเคชันไม่มีข้อมูลเพิ่มเติมสำหรับส่งไปยังการเพียร์การเชื่อมต่อ สำหรับการเชื่อมต่อนี้ การอ่านค่าในระดับเดียวกันในอนาคตจะทําให้เกิดเงื่อนไข "สิ้นสุดสตรีม" และการเขียนในอนาคตในปลายทางการเชื่อมต่อนี้จะไม่สําเร็จ
เงื่อนไข "สิ้นสุดสตรีม" จะมีผลก็ต่อเมื่อเพียร์การเชื่อมต่อได้รับข้อมูลที่ให้ไว้กับสแต็ก TCP เพื่อส่งออกก่อนหน้านี้เท่านั้น
| รายละเอียด | |||||
|---|---|---|---|---|---|
| พารามิเตอร์ |
|
||||
| แสดงผลค่า |
|
||||
otTcpStopListening
otError otTcpStopListening( otTcpListener *aListener )
ทำให้ Listener TCP นี้หยุดฟังการเชื่อมต่อขาเข้า
| รายละเอียด | |||||
|---|---|---|---|---|---|
| พารามิเตอร์ |
|
||||
| แสดงผลค่า |
|
||||
มาโคร
OT_TCP_ENDPOINT_TCB_NUM_PTR
OT_TCP_ENDPOINT_TCB_NUM_PTR 36
OT_TCP_ENDPOINT_TCB_SIZE_BASE
OT_TCP_ENDPOINT_TCB_SIZE_BASE 392
มีการเลือก OT_TCP_ENDPOINT_TCB_SIZE_BASE และ OT_TCP_ENDPOINT_TCB_NUM_POINTERS ไว้เพื่อให้ช่อง mTcb ของ otTcpEndpoint มีขนาดเดียวกับ struct tcpcb ใน TCPlp
ซึ่งเป็นสิ่งจำเป็นเนื่องจากช่อง mTcb จะถือว่าฟิลด์ mTcb ไม่ชัดเจนในการประกาศ แต่ระบบถือว่า struct tcpcb ในการใช้งาน TCP
OT_TCP_LISTENER_TCB_NUM_PTR
OT_TCP_LISTENER_TCB_NUM_PTR 3
OT_TCP_LISTENER_TCB_SIZE_BASE
OT_TCP_LISTENER_TCB_SIZE_BASE 16
มีการเลือก OT_TCP_LISTENER_TCB_SIZE_BASE และ OT_TCP_LISTENER_TCB_NUM_POINTERS รายการเพื่อให้ช่อง mTcbListener ของ otTcpListener มีขนาดเท่ากับ struct tcpcb_listen ใน TCPlp
ซึ่งเป็นสิ่งจำเป็นเนื่องจากฟิลด์ mTcbListen แม้จะไม่ชัดเจนในการประกาศ จะถือเป็น struct tcpcb ในการใช้งาน TCP
OT_TCP_RECEIVE_BUFFER_SIZE_FEW_HOPS
OT_TCP_RECEIVE_BUFFER_SIZE_FEW_HOPS 2598
ขนาดบัฟเฟอร์ที่แนะนำสำหรับการเชื่อมต่อ TCP ที่ข้ามการเชื่อมต่อแบบไร้สายไม่เกิน 3 ครั้ง
ในแพลตฟอร์มที่หน่วยความจำจำกัดเป็นพิเศษและในกรณีที่ไม่จำเป็นต้องใช้แบนด์วิดท์สูง ขอแนะนำให้เลือกขนาดบัฟเฟอร์ที่เล็กลงด้วยตนเอง
OT_TCP_RECEIVE_BUFFER_SIZE_MANY_HOPS
OT_TCP_RECEIVE_BUFFER_SIZE_MANY_HOPS 4157
ขนาดบัฟเฟอร์ที่แนะนำสำหรับการเชื่อมต่อ TCP ที่ข้ามผ่านการรับส่งข้อมูลแบบไร้สายจำนวนมาก
หากการเชื่อมต่อ TCP ข้ามผ่านการรับส่งข้อมูลจำนวนมาก (มากกว่า 6 ครั้ง) ขอแนะนำให้เลือกขนาดบัฟเฟอร์ขนาดใหญ่ด้วยตนเอง
แหล่งข้อมูล
หัวข้ออ้างอิง API ของ OpenThread จะมาจากซอร์สโค้ดซึ่งพร้อมใช้งานใน GitHub ดูข้อมูลเพิ่มเติมหรือมีส่วนร่วมในเอกสารประกอบของเราได้ที่แหล่งข้อมูล