首页 > 其他分享 >socket 实现udp网络数据通信

socket 实现udp网络数据通信

时间:2024-06-06 20:26:06浏览次数:23  
标签:数据通信 udp addr errno UDP include socket

利用udp实现网络数据通信

UDP(User Datagram Protocol) 是用户数据报协议,是 OSI 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。它是 IETF RFC 768 是 UDP 的正式规范。UDP 在 IP 数据包的头部仅仅加入了复用和数据完整性校验(数据包检查)的字段。UDP 是对 IP 层的一个简单封装,仅仅在 IP 数据包头部加入了复用(复用)和数据完整性校验(数据包检查)的字段。

UDP 的主要特点包括:

  1. 无连接:UDP 发送数据之前不需要建立连接,因此减少了开销和发送数据之前的时延。
  2. 尽最大努力交付:UDP 不保证可靠交付,也就是说,UDP 协议不保证数据报文能准确地到达目的地,也不保证数据报文的顺序性。
  3. 面向报文:UDP 一次发送一个完整的报文,并在发送报文时保留报文的边界。接收方也是一次接收一个完整的报文。
  4. 没有拥塞控制:UDP 发送方只管发送数据,不确认数据是否到达,因此没有拥塞控制。网络出现拥塞时,UDP 也不会降低发送速率。
  5. 支持一对一、一对多、多对一和多对多的交互通信

UDP客户端的代码(发送端)

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/udp.h>
#include <stdlib.h>
#include <string.h>

// 运行客户端可执行文件   ./xxx  服务器端口  服务器地址

int main(int argc,char *argv[])
{
	//检查参数有效性
	if (argc != 3)
	{
		fprintf(stderr, "argument is invaild ,errno:%d,%s\n",errno,strerror(errno));
		exit(1);
	}

	//1.创建UDP套接字             
	int udp_socket = socket(AF_INET, SOCK_DGRAM, 0);
	if (udp_socket == -1)
	{
		fprintf(stderr, "udp socket error,errno:%d,%s\n",errno,strerror(errno));
		exit(1);
	}

	//2.向目标主机发送消息,需要设置目标端口和目标地址
	char buf[128] = "ok";
	
	struct sockaddr_in  dest_addr;
	dest_addr.sin_family 		= AF_INET; 						//协议族,是固定的
	dest_addr.sin_port   		= htons(atoi(argv[1]));			//服务器端口,必须转换为网络字节序
	dest_addr.sin_addr.s_addr   = inet_addr(argv[2]);			//服务器地址 "192.168.64.xxx"  

	//3.发送客户端的上线时间
	sendto(udp_socket,buf,strlen(buf),0, (struct sockaddr *)&dest_addr, sizeof(dest_addr));
	
	while(1);

	return 0;

}

UDP服务器端的代码(接收端)

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/udp.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>



int main(int argc,char *argv[])
{
	//检查参数有效性
	if (argc != 3)
	{
		fprintf(stderr, "argument is invaild ,errno:%d,%s\n",errno,strerror(errno));
		exit(1);
	}

	
	//1.创建UDP套接字             
	int udp_socket = socket(AF_INET, SOCK_DGRAM, 0);
	if (udp_socket == -1)
	{
		fprintf(stderr, "udp socket error,errno:%d,%s\n",errno,strerror(errno));
		exit(1);
	}

	//2.需要先绑定服务器的端口和地址
	struct sockaddr_in  host_addr;

	host_addr.sin_family 		= AF_INET; 						//协议族,是固定的
	host_addr.sin_port   		= htons(atoi(argv[1]));			//目标端口,必须转换为网络字节序
	host_addr.sin_addr.s_addr   = inet_addr(INADDR_ANY);		//目标地址 "192.168.64.xxx"  已经转换为网络字节序  INADDR_ANY

	bind(udp_socket,(struct sockaddr *)&host_addr, sizeof(host_addr));

	//3.调用recvfrom等待接收数据,并且接收客户端的网络信息
	char buf[128] = {0};
	struct sockaddr_in  client;
	socklen_t client_len = sizeof(client);
     

	while(1)
	{
		recvfrom(udp_socket,buf,sizeof(buf), 0 ,&client,&client_len); //默认会阻塞
		printf("client ip is [%s],time is [%s]\n",inet_ntoa(client.sin_addr),buf);
		bzero(buf,sizeof(buf));
	}
	
	return 0;

}

在上面的代码中,udp_server.c 创建一个UDP socket,绑定到指定的端口,并等待接收数据。udp_client.c 创建一个UDP socket,并将数据发送到指定的IP地址和端口。

为了运行这些程序,我们需要先编译运行服务器端程序:

gcc udp_server.c -o udp_server  
./udp_server 8888

然后编译运行发送端程序:

gcc udp_client.c -o udp_client
./udp_client 192.168.xxx.xxx

如果代码用法有什么问题,请将问题发至网易邮箱 [email protected],作者将及时改正,欢迎与各位老爷交流讨论。

麻烦三连加关注!!!!

比心

标签:数据通信,udp,addr,errno,UDP,include,socket
From: https://www.cnblogs.com/zkbklink/p/18235941

相关文章

  • C语言通过socket实现TCP客户端
    socket概念​ 从wiki上了解,socket这个词追溯到1971年RFC147的发布。​ 目前我的理解:常用于指操作系统提供的API,该API允许使用TCP、UDP进行连接,但不仅限于TCP、UDP协议。实现目的利用系统提供函数接口,通过C语言实现对TCP服务器(IP地址)的连接,以及收发数据。实现......
  • websocket
     2024-06-0611:26:53.333DEBUG[http-nio-8080-exec-6]org.springframework.web.socket.handler.LoggingWebSocketHandlerDecorator62-[TxId:,SpanId:]TransporterrorinStandardWebSocketSession[id=e4702cd6-4150-c22c-b049-8da635daa236,uri=wss://zkh-g......
  • UDP协议实现多播功能
    /***author :[email protected]*@brief:程序可以加入到一个多播组中并等待服务器发送数据包,并且程序还需要具有发送功能,如果收到数据包则把消息内容输出到终端*@date:2024/06/06*@version:1.0*@note:none*......
  • UDP实现音频视频流传输
    UDP实现音频视频流传输服务器#include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>#include<arpa/inet.h>#include<fcntl.h>#include<sys/stat.h>#definePORT8080......
  • Linux基础 (十四):socket网络编程
         我们用户是处在应用层的,根据不同的场景和业务需求,传输层就要为我们应用层提供不同的传输协议,常见的就是TCP协议和UDP协议,二者各自有不同的特点,网络中的数据的传输其实就是两个进程间的通信,两个进程在通信时,传输层使用TCP协议将一方进程的应用层的数据传输给另一......
  • 基于c语言的UDP客户端、服务端二合一基础代码
    基于c语言的UDP客户端、服务端二合一基础代码示意图:准备好了吗,以下是基础代码:/****************************************************************************************************************************************字节序:数据以字节流的方式进行传输,底层都是......
  • 用udp协议传输文件
    用udp协议传输文件目录用udp协议传输文件头文件/宏定义客户端服务器头文件/宏定义#include<stdio.h>#include<stdlib.h>#include<string.h>#include<arpa/inet.h>#include<netinet/in.h>#include<sys/types.h>#include<sys/socket.h>#include<ti......
  • 网络编程中UDP协议通信
    #include<stdio.h>#include<sys/types.h>#include<sys/socket.h>#include<errno.h>#include<stdlib.h>#include<time.h>#include<string.h>#include<netinet/ip.h>#include<netinet/in.h>#include&......
  • TCP和UDP
    TCP和UDPTCP的可靠性特性序列号(Sequencing):TCP为每个传输的数据段分配一个唯一的序列号,接收端可以根据这些序列号重新组装数据。确认与重传(AcknowledgmentandRetransmission):TCP使用确认机制来确认数据段是否成功到达。如果接收端没有收到某个数据段,发送端会重传它。流量控......
  • 若依框架整合WebSocket
    若依框架整合WebSocket一、前端1、定义socket对象data(){return{webSocket:null,}}2、建立连接//如果webSocket为null进行建立连接if(!this.webSocket){this.webSocket=newWebSocket(`ws://localhost:8081/handleData/`); //建立连接......