UDPプロトコルを解析する方法
一、套接字(socket)
套接字socket: ip地址 + port端口号。在TCP/IP协议中,它唯一标识网络通讯中的一个进程。套接字用来描述网络连接的 一对一关系。
TCP/IP协议规定,网络数据流应采用 大端字节序,即 (内存)低地址高字节(数据)。
二、UDP_SOCKET 相关
UDP 协议 ---- 用户数据报协议(面向非连接) --- SOCK_DGRAM
h表示host,n表示network,l表示32位长整数,s表示16位短整数。
IPv4地址格式定义在netinet/in.h中,IPv4地址: sockaddr_in结构体,包括16位端口号和32位IP地址
struct sockaddr_in { uint8_t sin_len; sa_family_t sin_family; in_port_t sin_port; struct in_addr sin_addr; char sin_zero[8]; };
三、UDP socket 实例:
//udp_server.c
#include <stdio.h> #include<stdlib.h> #include<sys/types.h> #include<sys/socket.h> #include<arpa/inet.h> #include<netinet/in.h> #include<unistd.h> #include<string.h> #include<errno.h> void usage(const char *proc) { printf("%s:[ip][port]\n",proc); } int main(int argc,char *argv[]) { if(argc != 3) { usage(argv[0]); return 1; } char *_ip=argv[1]; int _port=atoi(argv[2]); int sock=socket(AF_INET,SOCK_DGRAM,0); if(sock < 0) { perror("socket"); exit(1); } struct sockaddr_in local; local.sin_family=AF_INET; local.sin_port=htons(_port); local.sin_addr.s_addr=inet_addr(_ip); if(bind(sock,(struct sockaddr*)&local,sizeof(local)) < 0) { perror("bind"); exit(2); } int done=0; char buf[1024]; struct sockaddr_in client; socklen_t len=sizeof(client); while(!done) { ssize_t _size=recvfrom(sock,buf,sizeof(buf)-1,0,(struct sockaddr*)&client,&len); if(_size > 0) { buf[_size]='\0'; printf("[%s : %d]: %s\n",inet_ntoa(client.sin_addr),ntohs(client.sin_port),buf); } else if(_size == 0) { printf("client close...\n"); } else {} } return 0; }
//udp_client.c
#include <stdio.h> #include<stdlib.h> #include<sys/types.h> #include<sys/socket.h> #include<arpa/inet.h> #include<netinet/in.h> #include<unistd.h> #include<string.h> #include<errno.h> void usage(const char *proc) { printf("%s:[ip][port]\n",proc); } int main(int argc,char *argv[]) { if(argc != 3) { usage(argv[0]); return 1; } char *_ip=argv[1]; int _port=atoi(argv[2]); int sock=socket(AF_INET,SOCK_DGRAM,0); if(sock < 0) { perror("socket"); exit(1); } struct sockaddr_in local; local.sin_family=AF_INET; local.sin_port=htons(_port); local.sin_addr.s_addr=inet_addr(_ip); if(bind(sock,(struct sockaddr*)&local,sizeof(local)) < 0) { perror("bind"); exit(2); } int done=0; char buf[1024]; struct sockaddr_in client; socklen_t len=sizeof(client); while(!done) { ssize_t _size=recvfrom(sock,buf,sizeof(buf)-1,0,(struct sockaddr*)&client,&len); if(_size > 0) { buf[_size]='\0'; printf("[%s : %d]: %s\n",inet_ntoa(client.sin_addr),ntohs(client.sin_port),buf); } else if(_size == 0) { printf("client close...\n"); } else {} } return 0; }
运行结果:
以上がUDPプロトコルを解析する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











PHP および UDP プロトコルを使用して非同期通信を実装する方法 最新のインターネット アプリケーションでは、非同期通信は非常に重要な方法となっています。非同期通信を使用すると、メインスレッドをブロックすることなくユーザーリクエストを同時に処理できるため、システムのパフォーマンスと応答速度が向上します。人気のバックエンド プログラミング言語である PHP は、UDP プロトコルを使用して非同期通信を実現する方法を教えてください。この記事では、PHP で UDP プロトコルを使用して簡単な非同期通信を実装する方法を、具体的なコード例を添付して紹介します。 1. UDP プロトコルの概要 U

一般的な UDP ポート番号は 53、69、161、2049、68、および 520 です。 UDP はポート番号を使用して、さまざまなアプリケーション用に独自のデータ送信チャネルを予約します: 1. ネットワーク ファイル システム (NFS)、ポート番号は 2049、2. 簡易ネットワーク管理プロトコル (SNMP)、ポート番号は 161、3. ドメイン名システム (DNS)、ポート番号は 53、4. 簡易ファイル転送システム (TFTP)、ポート番号は 69、5. 動的ホスト構成プロトコル (DHCP)、ポート番号は 68、6. ルーティング情報プロトコル、ポート番号は 520 などです。

UDP (User Datagram Protocol) は、時間に敏感なアプリケーションで一般的に使用される軽量のコネクションレス型ネットワーク プロトコルです。これにより、アプリケーションは TCP 接続を確立せずにデータを送受信できるようになります。サンプル Java コードを使用して UDP サーバーとクライアントを作成できます。サーバーは受信データグラムをリッスンして応答し、クライアントはメッセージを送信して応答を受信します。このコードを使用して、チャット アプリケーションやデータ収集システムなどの実際のユースケースを構築できます。

UDP は、「コネクションレス」トランスポート サービスを提供します。 UDP の中国語名はユーザー データグラム プロトコルです。OSI 参照モデルのコネクションレス型トランスポート層プロトコルです。シンプルで信頼性の低いトランザクション指向の情報送信サービスを提供します。UDP は、接続を確立せずにカプセル化されたデータを送信する方法をアプリケーションに提供します。 IPパケット方式です。

1. ソケット: ソケット: IP アドレス + ポート番号。 TCP/IP プロトコルでは、ネットワーク通信のプロセスを一意に識別します。ソケットは、ネットワーク接続間の 1 対 1 の関係を記述するために使用されます。 TCP/IP プロトコルは、ネットワーク データ フローがビッグ エンディアン バイト オーダー、つまり (メモリ) 下位アドレス上位バイト (データ) を使用することを規定しています。 2. UDP_SOCKET 関連の UDP プロトコル --- ユーザー データグラム プロトコル (非接続指向) --- SOCK_DGRAMh はホストを表し、n はネットワークを表し、l は 32 ビットの長整数を表し、s は 16 ビットの短整数を表します。 IPv4 アドレス形式は netinet/in.h で定義されており、IPv4 アドレス: sockadd

UDP プログラミングの基本入門 通信クラス DatagramSocket および DatagramPacket [データ パケット/データグラム] は、UDP プロトコルに基づいてネットワーク プログラムを実装します。 UDP データグラムは、データグラム ソケット DatagramSocket を介して送受信されます。システムは、UDP データグラムが宛先に安全に配信されることを保証しませんし、いつ到着するかも保証しません。 DatagramPacket オブジェクトは、送信者の IP アドレスとポート番号、受信者の IP アドレスとポート番号を含む UDP データグラムをカプセル化します。 UDP プロトコルの各データグラムは完全なアドレス情報を提供するため、送信者と受信者の間で接続を確立する必要はありません。基本プロセス Da の核となる 2 つのクラス/オブジェクト

UDP は、データ パケットをネットワークに送信する方法を提供するコネクションレス型トランスポート層プロトコルです。ただし、データ パケットの信頼性、順序、完全性は保証されず、また、輻輳制御やフロー制御などの機能も提供されません。 UDP の特徴: 1. 接続性がなく、データ送信前に接続を確立する必要がなく、データ パケットをターゲット ホストに直接送信できます; 2. 効率が高く、ヘッダーのオーバーヘッドが小さく、わずか 8 バイトです; 3. 信頼性が低く、データパケットの信頼性を提供するものではなく、データパケット送信後は紛失しても再送されない、データパケットの順序等を保証するものではありません。

DNS (DomainNameSystem) が TCP (TransmissionControlProtocol) ではなく UDP (UserDatagramProtocol) を使用する主な理由は、パフォーマンスと効率を考慮するためです。以下では、DNS が UDP プロトコルの使用を選択する理由について詳しく説明します。 小さなリクエストと高速な応答: DNS クエリは通常、小さなリクエストであり、必要なデータ送信は数バイトだけです。 UDP は、通信する前に接続を確立する必要がなく、宛先アドレスにパケットを送信して応答を待つコネクションレス型プロトコルです。このため、UDP は TCP よりも高速応答シナリオに適しています。低遅延: 通常、DNS クエリは高速なドメイン名解決サービスを提供するために低遅延を必要とします。
