Linux中udp服务端,客户端的开发

UDP通信相关函数:

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,

struct sockaddr *src_addr, socklen_t *addrlen);

函数说明:接收信息

  • 参数说明:
  • sockfd:套接字
  • buf:要接收的缓冲区
  • len:缓冲区的长度
  • flags:标志位,一般为0
  • src_addr:传出参数,发送方的地址
  • addrlen:发送方地址的长度

返回值:

成功返回读到的子节数

失败返回-1,并设置errno;

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,

const struct sockaddr *dest_addr, socklen_t addrlen);

函数说明:发送数据

  • sockfd:套接字
  • buf:要发送的缓冲区
  • len:缓冲区的长度
  • flags:标志位,一般为0
  • src_addr:传入参数,接收者的地址
  • addrlen:接收者地址的长度

udp服务端代码:

(相比于tcp服务端,不用liseten,accept)

而且udp服务端可以同时接收多个客户端发来的数据。

cpp 复制代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<arpa/inet.h>
#include <netinet/in.h>
#include<ctype.h>
int main()
{
	int cfd=socket(AF_INET,SOCK_DGRAM,0);
	if(cfd<0)
	{
		perror("socket error");
		return -1;
	}
	struct sockaddr_in serv;//
	struct sockaddr_in cli;//定义一个客户端地址,用于接收发来数据的客户端地址
bzero(&serv,sizeof(serv));
bzero(&cli,sizeof(cli));
	serv.sin_family=AF_INET;
	serv.sin_port=htons(8888);
	inet_pton(AF_INET,"192.168.230.130",&serv.sin_addr.s_addr);

	bind(cfd,(struct sockaddr*)&serv,sizeof(serv));//绑定
	char buf[128];
	int n;
	int i=0;
	socklen_t len;
	while(1)
	{
		len=sizeof(cli);
		memset(buf,0x00,sizeof(buf));
		n=recvfrom(cfd,buf,sizeof(buf),0,(struct sockaddr*)&cli,&len);//接收数据,并说的发送方的地址,端口
		printf("port==[%d],n==[%d],buf==[%s]\n",ntohs(cli.sin_port),n,buf);
		for(i=0;i<n;i++)
		{
			buf[i]=toupper(buf[i]);
		}
		sendto(cfd,buf,n,0,(struct sockaddr*)&cli,sizeof(cli));//发送数据
	}
	close(cfd);
	return 0;
}

我们可以使用 nc -u 命令进行检测;

udp客户端代码:

cpp 复制代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<arpa/inet.h>
#include <netinet/in.h>
int main()
{
	int cfd=socket(AF_INET,SOCK_DGRAM,0);
	if(cfd<0)
	{
		perror("socket error");
		return 0;
	}

	char buf[128];
	struct sockaddr_in ser;
	bzero(&ser,sizeof(ser));
	ser. sin_family=AF_INET;
	ser.sin_port=htons(8888);
inet_pton(AF_INET,"192.168.230.130",&ser.sin_addr.s_addr);
	int n;
	while(1)
	{
		memset(buf,0x00,sizeof(buf));
n=		read(STDIN_FILENO,buf,sizeof(buf));//从标准输入读数据

		sendto(cfd,buf,n,0,(struct sockaddr *)&ser,sizeof(ser));//向此地址发送数据

		memset(buf,0x00,sizeof(buf));
		n=recvfrom(cfd,buf,sizeof(buf),0,NULL,NULL);//不关心谁发的读数据,可以设为NULL
		
		printf("n==[%d],buf==[%s]\n",n,buf);
	}
	close(cfd);
	return 0;
}

服务端结果:

客户端结果:

相关推荐
曦夜日长5 分钟前
Linux系统篇,进程概念(一):计算机体系、操作系统的认识、程序的加载过程
linux·运维·网络
似水এ᭄往昔15 分钟前
【Linux网络编程】--Socket编程预备
linux·服务器·网络
hautcyh18 分钟前
C++new和delete
c++
笨蛋不要掉眼泪19 分钟前
Java并发编程 :深入剖析LinkedBlockingQueue
java·开发语言·网络·并发
杨浦老苏21 分钟前
网络连接实时可视化利器TapMap
网络·docker·可视化·监控·群晖
不会C语言的男孩22 分钟前
C++ Primer Plus 第10章:对象和类
开发语言·c++
皮卡狮25 分钟前
环境变量详解
linux
不会C语言的男孩26 分钟前
C++ Primer Plus 第11章:使用类
开发语言·c++
Lv_沐曦1 小时前
Windows磁盘驱动器取消黄色感叹号的方法
运维·windows·bitlocker·黄色感叹号
致Great1 小时前
Claude Code 上线 Dynamic Workflows:一句话调度 1000 个子智能体并行干活
java·linux·服务器