UDP通信代码

1、客户端代码

创建一个套接字

设置服务器地址

使用sendto向服务器端或接收端发送数据

使用recv接受数据

#include <sys/un.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>

#define BUFF_SIZE 1024

int main(void){
	int sockfd;
	struct sockaddr_in server_addr;
	int ret;
	int c;
	char buff[BUFF_SIZE];
	
	//创建一个套接字
	sockfd=socket(AF_INET,SOCK_DGRAM,0);
	
	//设置服务器地址
	server_addr.sin_family=AF_INET;
	server_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
	server_addr.sin_port=htons(9000);
	
	//向服务器发送数据
	strcpy(buff,"hello world");
	ret=sendto(sockfd,buff,strlen(buff)+1,0,(struct sockaddr*)&server_addr,sizeof(server_addr));
	if(ret==-1){
		perror("sendto");
		exit(errno);
	}
	
	printf("ret=%d\n",ret);
	
	
	return 0;
}

2、服务器端

创建网络套接字

设置服务器地址

绑定该套接字,使得套接字和对应的端口相关联

循环处理客户端请求

        使用recvfrom等待接收客户端发送的数据

        使用sendto发送数据至客户端

#include <sys/un.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>

#define BUFF_SIZE 1024

int main(void){
	int server_sockfd;
	int client_sockfd;
	char ch;
	int ret;
	int recv_len;
	char buff[BUFF_SIZE];
	
	//用来UNIx系统内部通信的地址,struct sockaddr_un
	struct sockaddr_in server_addr;
	struct sockaddr_in client_addr;
	int client_addr_len=sizeof(struct sockaddr_in);
	
	server_sockfd=socket(AF_INET,SOCK_DGRAM,0);
	
	//设置服务器地址
	server_addr.sin_family=AF_INET; //地址的域,相当于地址的类型,
	//AF_UNIX表示地址位于UNIX系统内部
	server_addr.sin_addr.s_addr=INADDR_ANY;
	//inet_addr("10.10.0.9");
	server_addr.sin_port=htons(9000);
	
	//绑定套接字,使得该套接字和对应的系统套接字文件相关联
	ret=bind(server_sockfd,(struct sockaddr*)&server_addr,sizeof(server_addr));
	if(ret==-1){
		perror("bind");
		exit(1);
	}
	
	//创建套接字队列,保存进入该服务器的客户端请求
	//ret=listen(server_sockfd,5);
	
	//循环处理客户端请求
	while(1){
		
		printf("server waiting\n");
		
		//等待并接受客户端请求
		//client_sockfd=accept(server_sockfd,(struct sockaddr*)&client_addr,&client_addr_len);
		recv_len=recvfrom(server_sockfd,buff,sizeof(buff),0,(struct sockaddr*)&client_addr,&client_addr_len);
		if(recv_len<0){
			perror("recvfrom");
			exit(errno);
		}
		
		printf("received:%s\n",buff);
	}
	close(server_sockfd);
	return 0;
}

由于Hololens可以运行Windows 10操作系统,因此可以使用C#语言编写UDP通信代码。以下是一个简单的Hololens UDP通信代码示例: 发送端代码: ```csharp using System; using System.Collections; using System.Collections.Generic; using System.Net; using System.Net.Sockets; using System.Text; using UnityEngine; public class UDPSender : MonoBehaviour { public string remoteIP = "192.168.0.2"; // 远程IP地址 public int remotePort = 12345; // 远程端口号 private UdpClient udpClient; void Start() { udpClient = new UdpClient(); } void Update() { string message = "Hello, World!"; // 要发送的消息 byte[] data = Encoding.UTF8.GetBytes(message); // 将消息转换为字节数组 udpClient.Send(data, data.Length, remoteIP, remotePort); // 发送消息 } void OnApplicationQuit() { udpClient.Close(); // 关闭UDP客户端 } } ``` 接收端代码: ```csharp using System; using System.Collections; using System.Collections.Generic; using System.Net; using System.Net.Sockets; using System.Text; using UnityEngine; public class UDPReceiver : MonoBehaviour { public int localPort = 12345; // 本地端口号 private UdpClient udpClient; void Start() { udpClient = new UdpClient(localPort); // 创建UDP客户端并绑定本地端口号 udpClient.BeginReceive(ReceiveCallback, null); // 开始异步接收消息 } void ReceiveCallback(IAsyncResult result) { IPEndPoint remoteEP = new IPEndPoint(IPAddress.Any, 0); byte[] data = udpClient.EndReceive(result, ref remoteEP); // 结束异步接收消息,并获取远程IP和端口号 string message = Encoding.UTF8.GetString(data); // 将字节数组转换为字符串 Debug.Log("Received message: " + message); udpClient.BeginReceive(ReceiveCallback, null); // 再次开始异步接收消息 } void OnApplicationQuit() { udpClient.Close(); // 关闭UDP客户端 } } ``` 发送端代码中使用了`UdpClient`类的`Send`方法将消息发送给指定的远程IP和端口号。接收端代码中使用了`UdpClient`类的`BeginReceive`方法开始异步接收消息,接收到消息后会调用`ReceiveCallback`方法处理消息。在`ReceiveCallback`方法中,使用`UdpClient`类的`EndReceive`方法获取接收到的消息和远程IP和端口号,并将消息转换为字符串。最后再次调用`BeginReceive`方法开始下一次异步接收消息。在应用程序退出时,需要调用`Close`方法关闭UDP客户端。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值