网络编程:udp通信流程代码实现客户端和服务器的连接

该博客详细介绍了如何使用C语言实现UDP通信,包括客户端和服务器端的代码实现。客户端负责发送数据,服务器端接收数据并反馈。通过`sendto`和`recvfrom`函数,实现了数据的发送与接收,展示了完整的UDP通信流程。
摘要由CSDN通过智能技术生成

udp通信流程代码实现客户端和服务器的连接

原理流程:
在这里插入图片描述
函数使用:

//接收数据
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                        struct sockaddr *src_addr, socklen_t *addrlen);
参数: int sockfd 套接字描述符
     void *buf 存储接收的数据
	 size_t len 存储数据的空间大小
     int flags 标志设置为0
     struct sockaddr *src_addr,存储数据发送方地址
     socklen_t *addrlen存储发送方地址的长度
返回值:返回接收的字节数, 失败-1

//反馈数据
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
                      const struct sockaddr *dest_addr, socklen_t addrlen);
参数: int sockfd 套接字描述符
     const void *buf 要发送的数据
	 size_t len 发送数据的长度
     int flags 标志设置为0
     struct sockaddr * dest_addr 目标地址
     socklen_t addrlen地址长度
返回值:返回发送的字节数, 失败-1

实现的完整代码如下:

//发送方:客户端
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <string.h>
#include <netinet/in.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <pthread.h>
#include <stdbool.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(void)
{
	//1.创建套接字UDP--SOCK_DGRAM
	int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
	if(sockfd < 0)
	{
		perror("socket fail");
		return -1;
	}

	//2.发送数据
	struct sockaddr_in destAddr;  //定一个存储地址,端口号的替代结构体
	memset(&destAddr, 0, sizeof(destAddr)); //初始化为0
	destAddr.sin_family = AF_INET;//初始化地址族IPV4
	destAddr.sin_port = htons(8999); //设置端口号(网络字节序号)
	destAddr.sin_addr.s_addr = inet_addr("192.168.24.21");//发给谁谁谁
	
	char sendbuffer[]="hello world";								//发送端要保存服务器的地址
	ssize_t size = sendto(sockfd, sendbuffer, sizeof(sendbuffer), 0, (struct sockaddr*)&destAddr, sizeof(destAddr));
	if(size <0){
	
		perror("sendto error");
		close(sockfd);
		return -1;
	}
	
	//接收反馈数据
	char recvbuffer[1024];
	 size = recvfrom(sockfd, recvbuffer, sizeof(recvbuffer), 0, NULL, NULL);
	if(size < 0)
	{
			perror("recvfrom error");
			return -1;
	}
	printf("%s\n", recvbuffer);
	
	close(sockfd);
}
//接收方:服务器
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <string.h>
#include <netinet/in.h>
#include <unistd.h>
#include <semaphore.h>
#include <stdbool.h>
#include <arpa/inet.h>
#include <sys/epoll.h>
#define MAXSIZE 100


int main(void)
{

	//1.创建套接字 UDP--SOCK_DGRAM
	int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
	if(sockfd < 0)
	{
		perror("socket fail");
		return -1;
	}
	
	//设置地址复用
	int on = 1;
	int ropt  = setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));


	
	//初始化
	struct sockaddr_in addr;  //定一个存储地址,端口号的替代结构体
	memset(&addr, 0, sizeof(addr)); //初始化为0
	addr.sin_family = AF_INET;//初始化地址族IPV4
	addr.sin_port = htons(8999); //设置端口号(网络字节序号)
	addr.sin_addr.s_addr = INADDR_ANY;//初始化绑定地址, 用INADDR_ANY--表示绑定本机地址
	
	//2.绑定
	int ret = bind(sockfd, (struct sockaddr*)&addr, sizeof(addr));
	if(ret < 0)
	{
		perror("bind fail:");
		return -1;
	}

	//3.接收数据
	struct sockaddr_in srcAddr;//保存发送方的地址
	socklen_t len = sizeof(srcAddr);
	char recvbuffer[1024];												//服务器要保存发过来的客户地址
	ssize_t size = recvfrom(sockfd, recvbuffer, sizeof(recvbuffer), 0, (struct sockaddr*)&srcAddr, &len);
	if(size < 0)
	{
			perror("recvfrom error");
			return -1;
	}
	
	printf("%s\n", recvbuffer);
	
	//反馈数据给发送端
	strcat(recvbuffer, "这里是我收到的数据反馈");
	 size = sendto(sockfd, recvbuffer, sizeof(recvbuffer), 0, (struct sockaddr*)&srcAddr, len);
	
	
	//关闭套接字
	close(sockfd);
	return 0;
}

实现结果:收发数据点对点通信效果,一段发数据,一段收数据并反馈接一段数据
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值