我々はUDPベースのサーバーのRAW APIを達成する前に、次の、我々は、RAW API UDPクライアントのさらなる使用を実現します。
。1 、UDPのプロトコルを概説します
それは、処理のためのものであり、TCPプロトコルのパケットはコネクションレスプロトコルであるとしてUDPは、ネットワーク内のユーザーデータグラムプロトコルプロトコルの略です。OSIモデルでは、トランスポート層では、上位層プロトコルがIPです。そこ組立、UDPパケットのグループ化を提供していないと短所をソートメッセージが送信される場合には、データパケットは、完全なセキュリティが到着したかどうかは知られていないことはできません。
プロトコルの主な役割は、圧縮形式にUDPトラフィック・ネットワーク・データ・パケットです。典型的なデータパケットは、バイナリデータの送信単位です。各パケットの最初の8つのバイトは残りのバイトが特定のデータ転送を含むように、ヘッダ情報を含むために使用されます。
各ドメインは、2を占める請求UDPヘッダは、4つのドメインからなる各バイトとして次の送信元ポート番号、宛先ポート番号、データグラム長、チェックサム値。以下のデータ構造:
UDPプロトコルは、それぞれのデータ伝送路を保持する異なるアプリケーションにポート番号を使用します。UDPとTCPプロトコルは、このメカニズムの実装を使用すると、同じ時間内に複数のアプリケーションへのデータの同時送受信をサポートしています。ソースポートによって送信されたデータの送信(クライアントまたはサーバー側でもよい)、UDPデータパケットの一つは、宛先ポートがデータ受信装置によって受信されたデータの一つです。一部のネットワークアプリケーションでは、唯一の予備または登録に事前に静的ポートを使用し、他のネットワークアプリケーションながら、あなたはダイナミックポートが登録されていない使用することができます。なぜなら記憶されているポート番号、0から65535までのポート番号の有効範囲を使用して2つのバイトのUDPヘッダー。一般的に、ポート番号は49151は、動的ポートよりも大きいです。
長さは、データ・パケットの数は合計バイト数を含むヘッダとデータ部分を含んでいます。ヘッダ長が固定されているので、フィールドが主に可変長データ部分を計算するために使用されるからです。データグラムの最大長及び動作環境に応じて変化します。理論的には、ヘッダを含むデータグラムの最大長は、65535のバイトを含みます。しかし、いくつかの実用的なアプリケーションでは、データのサイズが、時には8192バイトに減少し、報告された制限する傾向があります。
UDPプロトコルヘッダのチェックサム値は、データのセキュリティを確保します。データ送信側で特別な計算アルゴリズムによって得られた最初の検査値は、受信機に送信した後、まだ再計算する必要があります。データグラム等によるラインノイズへの損傷ので、送信または改ざん、中第三者であり、チェックサム計算された値は、受信者は、エラーを検出することができるかどうかとなるUDPプロトコルに一致しない送信した場合。
2 、UDPのクライアントの設計
私たちは、簡単にUDPデータグラムプロトコルとその前を導入し、その後、私たちは、クライアントのUDPベースのプロトコルを達成するための方法を検討します。
まず、聞かせてのは、UDPに関連付けられているAPI関数を見て、彼らは私たちのアプリケーションを実装するためにそれらを使用する必要がある必要があり、予備的な導入を行います。そしてとしての機能は次のとおりです。
我々は、我々は実装はUDPクライアントを手順を説明し、UDPサーバーの実装手順を学んできました。
まず第一に、それは新しいUDP制御ブロックを作成することはまだあります。
次に、サーバー、アドレスとポート備えるの構成情報をサーバとの接続を確立します。
接続は問題ありません場合は次に、クライアントコールバック関数を登録します。そして、それは機能が複雑に関係してサーバー側の実装が達成されます。私達はちょうど私たちがサーバーに固定された情報を送信するので、単純なUDPクライアントを実装し、応答を受信した後、対応する情報を送信し続けます。
最後に、クライアントので、あなたはコールバック関数を登録した後ので、クライアントが初めて対話を開始することを望んでいる、対話の開始剤です。
3 、UDPのクライアントの実装
達成するために、UDPサーバ、我々はまだ二つの側面に分けられます。まず、初期設定のUDPクライアントの一部;第二に、UDPクライアントが特定のコンテンツを達成するためのコンテンツは、コールバック関数です。
UDPクライアントを達成するための初期設定の最初の部分。UDPは、我々は、比較的簡単な検証サーバーのポートを使用するサーバーの指定されたアドレスとポートに接続され、新たな制御ブロック、私たちのループと同じように定義します。そして、初めて通信のためにクライアントを開始し、コールバック関数を登録します。具体的なコードは次のよう:
1 / * UDPクライアントの初期設定* / 2 空隙 UDP_Client_Initialization(ボイド) 3。 { 4。 DestIPaddr ip_addr_t; 5 err_tのERR; 6 構造体 udp_pcb * UPCB; 7 CHARデータ[] = " これは、Aクライアントです。" ; 8 。9 / * サーバのIPアドレスを設定/ * 10 IP4_ADDR(&DestIPaddr、udpServerIP [ 0 []、udpServerIP 。1 ]、udpServerIP [ 2 []、udpServerIP 。3 ]); 11 12は / *新しいUDP制御ブロック作成* / 13である UPCB = udp_new(); 14 15 IF(!UPCB = NULL) 16 { 17 / * サーバアドレス、ポート設定* / 18である ERR = udp_connect(UPCB、&DestIPaddr、UDP_ECHO_SERVER_PORT) ; 19 20である IF(ERR == ERR_OK) 21である { 22れる / * 登録されたコールバック関数* / 23である udp_recv(UPCB、UDPClientCallback、NULL); 24 / * *データ送信、最初のクライアントが、サーバへのデータ接続を送信します送信元IPアドレスが設定されている場合、送信機能は、送信元IPアドレスの設定を見つけるために横断します、データ送信が失敗します。そこに発生する問題の概要で後述* * / 25 UdpClientSendPacket(upcb、データ)。 26 } 27 } 28 }
第二に、コンテンツのUDPクライアントの具体的な実装を実現します。私たちのクライアントへの簡単な応答を達成するために、私たちは、同じサーバーのコンテンツに戻るようにします。
1 /* 定义UDP客户端数据处理回调函数 */ 2 static void UDPClientCallback(void *arg,struct udp_pcb *upcb,struct pbuf *p,const ip_addr_t *addr,u16_t port) 3 { 4 udp_send(upcb, p); //数据回显 5 6 pbuf_free(p); 7 } 8 9 /* 客户端数据发送函数 */ 10 void UdpClientSendPacket(struct udp_pcb *upcb,char* data) 11 { 12 struct pbuf *p; 13 14 /* 分配内存空间 */ 15 p = pbuf_alloc(PBUF_TRANSPORT,strlen((char*)data), PBUF_POOL); 16 17 if (p != NULL) 18 { 19 20 /* 复制数据到pbuf */ 21 pbuf_take(p, (char*)data, strlen((char*)data)); 22 23 /* 发送数据 */ 24 udp_send(upcb, p); //发送数据 25 26 /* 释放pbuf */ 27 pbuf_free(p); 28 } 29 }
当然,如果我们不想人云亦云的回复服务器,则可以编辑我们自己的数据包然后发送回去。所以我们想要实现复杂的应用时,只需要重新编写合适的回调函数就可以了!
4、结论
我们完成了简单的,基于RAW API的UDP客户端,其本身并不复杂。同样的我们使用网络软件测试其功能,我们在电脑上建立一个服务器端,然后通过我们这个客户端去连接它。能够进行连接并发送接受数据,说明我们这个客户端的设计是符合要求的。
至此我们完成了UDP客户端及服务器的实现,后续我们将在次基础上实现更为复杂的应用。
欢迎关注: