(一)UDP基本编程步骤

UDP服务端编程分5步:

1.创建 UDP socket套接字,用socket函数。

2.设置socket的属性,用setsockopt()函数,(可选)

3.往socket绑定包含 IP信息,地址信息的 struct sockaddr_in(IPv4)结构体。用bind()函数

4.循环接收消息,用recvfrom()函数

5.关闭socket套接字

UDP客户端编程分:

1.创建 UDP socket套接字,用socket函数。

2.用sendto()函数往指定的IP,地址发送信息。

UDP的发送函数sendto()和接收函数 recvfrom():

1.sendto():

int ret = recvfrom(int sockfd,void *buf,size_t len,0, struct sockaddr *to , int fromlen);

第一个参数为服务端的udp监听套接字

第二个参数为发送数据的缓冲区

第三个参数为缓存区的大小

第四个参数一般为0;

第五个参数一般为:记录地址信息,ip信息的结构体 。

第六个参数为:第五个参数的大小。

返回值:成功返回实际发送出去的信息的字节数,失败返回-1

2.recvfrom():

int ret = recvfrom(int sockfd,void *buf,size_t len,0, struct sockaddr *from,socket_t *fromlen);

第一个参数为服务端的udp监听套接字

第二个参数为接收数据的缓冲区

第三个参数为缓存区的大小

第四个参数一般为0;

第五个参数一般为:记录地址信息,ip信息的结构体 。

第六个参数为:第五个参数的大小,取地址。

返回值:成功返回接收到的信息的字节数,失败返回-1

头文件:

#ifndef _MYHEAD_H_
#define _MYHEAD_H_

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <unistd.h>
#include <errno.h>
#include <sys/stat.h>
#include <dirent.h>
#include <sys/mman.h>
#include <sys/wait.h>
#include <signal.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/msg.h>
#include <sys/sem.h>
#include <pthread.h>
#include <semaphore.h>
#include <poll.h>
#include <sys/epoll.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netinet/in.h>


#endif

服务端:

#include"myhead.h"
char rbuf[50];

int main()
{
	int sockfd;
	int size;
	int ret;
	int on =1;
	struct sockaddr_in saddr;
	struct sockaddr_in raddr;

	//设置地址信息,ip信息
	size = sizeof(struct sockaddr_in);
	bzero(&saddr,size);
	saddr.sin_family = AF_INET;
	saddr.sin_port = htons(8888);
	saddr.sin_addr.s_addr = htonl(INADDR_ANY);

	//创建udp 的套接字
	sockfd = socket(AF_INET,SOCK_DGRAM,0);
	if(sockfd<0)
	{
		perror("socket failed");
		return -1;
	}

	//设置端口复用
	setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on)); 

	//绑定地址信息,ip信息
	ret = bind(sockfd,(struct sockaddr*)&saddr,sizeof(struct sockaddr));
	if(ret<0)
	{
		perror("sbind failed");
		return -1;
	}

	int val = sizeof(struct sockaddr);
	//循环接收客户端发来的消息
	while(1)
	{
		puts("waiting data");
		ret=recvfrom(sockfd,rbuf,50,0,(struct sockaddr*)&raddr,&val);
		if(ret <0)
		{
			perror("recvfrom failed");
		}

		printf("the data :%s
",rbuf);
		bzero(rbuf,50);
	}
	//关闭udp套接字,这里不可达的。
	close(sockfd);
	return 0;
}

客户端:

#include"myhead.h"
char wbuf[50];

int main()
{
	int sockfd;
	int size,on = 1;
	struct sockaddr_in saddr;
	int ret;

	size = sizeof(struct sockaddr_in);
	bzero(&saddr,size);

	//设置地址信息,ip信息
	saddr.sin_family = AF_INET;
	saddr.sin_port = htons(8888);
	saddr.sin_addr.s_addr = inet_addr("192.168.152.128");//192.168.152.128为服务端所在的ip,由于本代码是本机测试,所以写的是自己的ip

	//创建udp 的套接字
	sockfd= socket(AF_INET,SOCK_DGRAM,0);
	if(sockfd<0)
	{
		perror("failed socket");
		return -1;
	}
	//设置端口复用
	setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on));

	//循环发送信息给服务端
	while(1)
	{
		puts("please enter data:");
		scanf("%s",wbuf);
		ret=sendto(sockfd,wbuf,50,0,(struct sockaddr*)&saddr,
			sizeof(struct sockaddr));
		if(ret<0)
		{
			perror("sendto failed");
		}

		bzero(wbuf,50);
	}
	close(sockfd);
	return 0;
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UDP是一种无连接的协议,适用于一些需要快速传输数据、但可靠性要求相对较低的应用场景。DNS(Domain Name System)是一种用于将域名转换为IP地址的网络协议。 在UDP编程中,我们可以使用Python的socket库来创建UDP套接字,实现UDP通信。具体步骤如下: 1. 导入socket库 ```python import socket ``` 2. 创建UDP套接字 ```python udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) ``` 其中,socket.AF_INET表示使用IPv4协议,socket.SOCK_DGRAM表示使用UDP协议。 3. 绑定端口号 ```python udp_socket.bind(("localhost", 8888)) ``` 这里以本地主机为例,绑定了端口号为8888的UDP套接字。 4. 接收数据 ```python data, addr = udp_socket.recvfrom(1024) ``` 该语句会阻塞程序,等待接收数据。当收到数据时,会返回一个元组,其中data表示接收到的数据,addr表示发送方的地址信息。 5. 发送数据 ```python udp_socket.sendto(data, addr) ``` 该语句将data数据发送给addr地址。 在DNS中,我们可以使用Python的socket库来实现DNS查询。具体步骤如下: 1. 创建UDP套接字 ```python dns_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) ``` 2. 发送DNS查询请求 ```python dns_socket.sendto(query_data, (dns_server_ip, dns_server_port)) ``` 其中,query_data表示DNS查询请求数据,dns_server_ip和dns_server_port表示DNS服务器的地址和端口号。 3. 接收DNS查询响应 ```python response_data, server_addr = dns_socket.recvfrom(1024) ``` 该语句会阻塞程序,等待接收DNS查询响应。当收到响应时,会返回一个元组,其中response_data表示DNS查询响应数据,server_addr表示DNS服务器的地址信息。 以上就是UDP编程和DNS查询的基本步骤

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值