×

UDP通信机制详解

前端技术网 前端技术网 发表于2023-12-25 00:14:23 浏览1367 评论0

抢沙发发表评论

一、什么是UDP端口

UDP(User Datagram Protocol)用户数据报协议

UDP通信机制详解

用户数据报协议(UDP)是 ISO参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。 UDP协议基本上是 IP协议与上层协议的接口。 UDP协议适用端口分辨运行在同一台设备上的多个应用程序。

由于大多数网络应用程序都在同一台机器上运行,计算机上必须能够确保目的地机器上的软件程序能从源地址机器处获得数据包,以及源计算机能收到正确的回复。这是通过使用 UDP的“端口号”完成的。例如,如果一个工作站希望在工作站 128.1.123.1上使用域名服务系统,它就会给数据包一个目的地址 128.1.123.1,并在 UDP头插入目标端口号 53。源端口号标识了请求域名服务的本地机的应用程序,同时需要将所有由目的站生成的响应包都指定到源主机的这个端口上。 UDP端口的详细介绍可以参照相关文章。

与 TCP不同, UDP并不提供对 IP协议的可靠机制、流控制以及错误恢复功能等。由于 UDP比较简单, UDP头包含很少的字节,比 TCP负载消耗少。

UDP通信机制详解

UDP适用于不需要 TCP可靠机制的情形,比如,当高层协议或应用程序提供错误和流控制功能的时候。 UDP是传输层协议,服务于很多知名应用层协议,包括网络文件系统(NFS)、简单网络管理协议(SNMP)、域名系统(DNS)以及简单文件传输系统(TFTP)。

协议结构

Source Port— 16位。源端口是可选字段。当使用时,它表示发送程序的端口,同时它还被认为是没有其它信息的情况下需要被寻址的答复端口。如果不使用,设置值为0。

Destination Port— 16位。目标端口在特殊因特网目标地址的情况下具有意义。

Length— 16位。该用户数据报的八位长度,包括协议头和数据。长度最小值为8。

Checksum— 16位。IP协议头、UDP协议头和数据位,最后用0填补的信息假协议头总和。如果必要的话,可以由两个八位复合而成。

Data—包含上层数据信息。

相关链接 http://www.javvin.com/protocol/rfc768.pdf:User Datagram Protocol(UDP) Specifications

http://www.iana.org/assignments/port-numbers:UDP and TCP port numbers

二、UDP和Socket通信步骤

这是在网上找到的,希望对你有所帮助。

sockets(套接字)编程有三种,流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),原始套接字(SOCK_RAW);

WINDOWS环境下TCP/UDP编程步骤:

1.基于TCP的socket编程是采用的流式套接字。

在这个程序中,将两个工程添加到一个工作区。要链接一个ws2_32.lib的库文件。

服务器端编程的步骤:

1:加载套接字库,创建套接字(WSAStartup()/socket());

2:绑定套接字到一个IP地址和一个端口上(bind());

3:将套接字设置为监听模式等待连接请求(listen());

4:请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept());

5:用返回的套接字和客户端进行通信(send()/recv());

6:返回,等待另一连接请求;

7:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。

服务器端代码如下:

#include<stdio.h>

#include<Winsock2.h>

void main()

{

WORD wVersionRequested;

WSADATA wsaData;

int err;

wVersionRequested= MAKEWORD( 1, 1);

err= WSAStartup( wVersionRequested,&wsaData);

if( err!= 0){

return;

}

if( LOBYTE( wsaData.wVersion)!= 1||

HIBYTE( wsaData.wVersion)!= 1){

WSACleanup();

return;

}

SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);

SOCKADDR_IN addrSrv;

addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);

addrSrv.sin_family=AF_INET;

addrSrv.sin_port=htons(6000);

bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

listen(sockSrv,5);

SOCKADDR_IN addrClient;

int len=sizeof(SOCKADDR);

while(1)

{

SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);

char sendBuf[50];

sprintf(sendBuf,"Welcome%s to here!",inet_ntoa(addrClient.sin_addr));

send(sockConn,sendBuf,strlen(sendBuf)+1,0);

char recvBuf[50];

recv(sockConn,recvBuf,50,0);

printf("%s\n",recvBuf);

closesocket(sockConn);

}

}

客户端编程的步骤:

1:加载套接字库,创建套接字(WSAStartup()/socket());

2:向服务器发出连接请求(connect());

3:和服务器端进行通信(send()/recv());

4:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。

客户端的代码如下:

#include<stdio.h>

#include<Winsock2.h>

void main()

{

WORD wVersionRequested;

WSADATA wsaData;

int err;

wVersionRequested= MAKEWORD( 1, 1);

err= WSAStartup( wVersionRequested,&wsaData);

if( err!= 0){

return;

}

if( LOBYTE( wsaData.wVersion)!= 1||

HIBYTE( wsaData.wVersion)!= 1){

WSACleanup();

return;

}

SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);

SOCKADDR_IN addrSrv;

addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");

addrSrv.sin_family=AF_INET;

addrSrv.sin_port=htons(6000);

connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

char recvBuf[50];

recv(sockClient,recvBuf,50,0);

printf("%s\n",recvBuf);

send(sockClient,"hello",strlen("hello")+1,0);

closesocket(sockClient);

WSACleanup();

}

2.基于UDP的socket编程是采用的数据报套接字。

在这个程序中,将两个工程添加到一个工作区。同时还要链接一个ws2_32.lib的库文件。

服务器端编程的步骤:

1:加载套接字库,创建套接字(WSAStartup()/socket());

2:绑定套接字到一个IP地址和一个端口上(bind());

3:等待和接收数据(sendto()/recvfrom());

4:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。

服务器端代码如下:

#include<winsock2.h>

#include<stdio.h>

void main()

{

WORD wVersionRequested;

WSADATA wsaData;

int err;

wVersionRequested= MAKEWORD( 1, 1);

err= WSAStartup( wVersionRequested,&wsaData);

if( err!= 0)

{

return;

}

if( LOBYTE( wsaData.wVersion)!= 1||

HIBYTE( wsaData.wVersion)!= 1)

{

WSACleanup();

return;

}

SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0);

SOCKADDR_IN addrSrv;

addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);

addrSrv.sin_family=AF_INET;

addrSrv.sin_port=htons(7003);

bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

char recvBuf[50];

SOCKADDR addrClient;

int len=sizeof(SOCKADDR);

recvfrom(sockSrv,recvBuf,50,0,(SOCKADDR*)&addrClient,&len);

printf("%s\n",recvBuf);

closesocket(sockSrv);

WSACleanup();

}

对于基于UDP的socket客户端来说,要进行如下步骤:

1:创建一个套接字(socket);

2:向服务器发送数据(sendto);

3:关闭套接字;

代码如下:

#include<winsock2.h>

#include<stdio.h>

void main()

{

WORD wVersionRequested;

WSADATA wsaData;

int err;

wVersionRequested= MAKEWORD( 2, 2);

err= WSAStartup( wVersionRequested,&wsaData);

if( err!= 0){

return;

}

if( LOBYTE( wsaData.wVersion)!= 2||

HIBYTE( wsaData.wVersion)!= 2){

WSACleanup();

return;

}

SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0);

SOCKADDR_IN addrClient;

addrClient.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");

addrClient.sin_family=AF_INET;

addrClient.sin_port=htons(8889);

SOCKADDR_IN addrSrv;

sendto(sockClient,"hi",3,0,(SOCKADDR*)&addrClient,sizeof(SOCKADDR));

}

LINUX环境下TCP/UDP编程步骤:

TCP编程步骤:

一.服务端:

1.socket(int domain,int type,int protocol):建立套接字;

2.bind(int sockid,struct sockaddr*addrp,socklen_t addrlen):把本机地址和端口跟上一步建立的socket绑定在一起;

3.listen(int sockid,int qsize):监听某套接字;

4.fd=accept(int sockid,struct sockaddr*callerid,socklen_t*addrlenp):等待某套接字接收信息;

5.recv(int fd,void*buf,size_t nbytes,int flags):从套接字接收数据;

6.close(fd)和close(sockid)

二.客户端:

1. socket():建立套接字;

2.connect(int sockid,struct sockaddr*serv_addrp,socklen_t addrlen):连接到服务器;

3. send(int sockfd,const void*buf,size_t nbytes,int flags):发送数据到服务器.

4. close(sockid);

UDP编程步骤:

一,服务端:

1. socket():同上;

2. bind():同上;

3. recvfrom(int sockfd,void*buff,size_t nbytes,int flags,struct sockaddr*from,socklen_t*addrlen):在套接字口接收数据,并且记录下接收到的数据来源;一定要注意这里的参数addrlen,它不仅是函数的输出,也是函数的输入!所以要在调用该函数之前对addrlen赋值sizeof(struct sockaddr)。否则返回的地址from将会出错!

4. close(sockfd);

二.客户端:

1. socket();同上;

2. sendto(int sockfd,const void*buff,size_t nbytes,int flags,const struct sockaddr*to,socklen_t addrlen):往指定的地址发送数据;

3. close(sockfd);

三、UDP协议如何进行通信

B并不用确定A的端口号,因为UDP本身就是不面向连接的数据传送,所以不存在连接问题。

参考如下:

UDP是一个无连接协议,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。

由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消息。

文章分享结束,UDP通信机制详解和UDP和Socket通信步骤的答案你都知道了吗?欢迎再次光临本站哦!