网络通信(基于UDP协议的Socket编程模型)

被接收者需要完成的任务(服务端):

1、创建socket内核对象,内核创建完成后会返回它的描述符

type:SOCK_DGRAM

2、准备本机地址(ip地址+端口号)

3、绑定(把本机地址与socket对象进行绑定)

for(;;)

{

4、接收请求,同时接收发送者的地址

5、返回结果,按发送者的地址进行返回

}

6、关闭Socket对象

发送者需要完成的任务:

1、创建socket内核对象,内核创建完成后会返回它的描述符

type:SOCK_DGRAM

2、准备接收者的地址(ip地址+端口号)

for(;;)

{

3、发送请求,根据接收者的地址发送数据

4、接收结果,并接收返回者的地址

}

5、关闭Socket对象

cpp 复制代码
size_t sendto(int sockfd, const void *buf, size_t len, int flags,
                      const struct sockaddr *dest_addr, socklen_t addrlen);
功能:UDP专用的数据发送函数。
dest_addr:收件人的地址。
addrlen:地址长度。
                      
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                        struct sockaddr *src_addr, socklen_t *addrlen);
功能:UDP专用的数据接收函数。
src_addr:发件人的地址,也是数据返回时的地址
addrlen:地址长度,既是输入也是输出

服务端:

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main(int argc,const char* argv[])
{
	int sockfd = socket(AF_INET,SOCK_DGRAM,0);
	if(0 > sockfd)
	{
		perror("socket");
		return -1;
	}

	struct sockaddr_in addr;
	addr.sin_family = AF_INET;
	addr.sin_port = htons(3344);
	addr.sin_addr.s_addr = inet_addr("10.0.2.15");
	socklen_t addrlen = sizeof(addr);

	if(bind(sockfd,(struct sockaddr*)&addr,addrlen))
	{
		perror("bind");
		return -2;
	}

	char buf[BUFSIZ];
	for(;;)
	{
		int ret = recvfrom(sockfd,buf,BUFSIZ,0,
				(struct sockaddr*)&addr,&addrlen);
		if(0 >= ret)
			break;

		printf("recv:%s byte:%d from:%s:%hu\n",
				buf,ret,inet_ntoa(addr.sin_addr),ntohs(addr.sin_port));

		strcat(buf,",return!");
		ret = sendto(sockfd,buf,strlen(buf)+1,0,
				(struct sockaddr*)&addr,addrlen);
		if(0 >= ret)
			break;
	}

	printf("通信结束!\n");
	close(sockfd);
	return 0;
}
cpp 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main(int argc,const char* argv[])
{
	int sockfd = socket(AF_INET,SOCK_DGRAM,0);
	if(0 > sockfd)
	{
		perror("socket");
		return -1;
	}	

	struct sockaddr_in addr;
	addr.sin_family = AF_INET;
	addr.sin_port = htons(3344);
	addr.sin_addr.s_addr = inet_addr("10.0.2.15");
	socklen_t addrlen = sizeof(addr);

	if(connect(sockfd,(struct sockaddr*)&addr,addrlen))
	{
		perror("connect");
		return -2;
	}

	char buf[BUFSIZ];
	for(;;)
	{
		printf(">>>");
		scanf("%s",buf);

		//int ret = sendto(sockfd,buf,strlen(buf)+1,0,
		//		(struct sockaddr*)&addr,addrlen);

		int ret = send(sockfd,buf,strlen(buf)+1,0);
		if(0 >= ret || !strcmp("quit",buf))
			break;

		// ret = recvfrom(sockfd,buf,BUFSIZ,0,
		//		(struct sockaddr*)&addr,&addrlen);
		ret = recv(sockfd,buf,BUFSIZ,0);
		if(0 >= ret)
			break;

		printf("recv:%s byte:%d from:%s:%hu\n",buf,ret,inet_ntoa(addr.sin_addr),ntohs(addr.sin_port));
	}
	
	printf("通信结束!\n");
	close(sockfd);
	return 0;
}
相关推荐
deeper_wind5 小时前
keeplived双击热备配置
linux·运维·网络
技术猿188702783518 小时前
实现“micro 关键字搜索全覆盖商品”并通过 API 接口提供实时数据(一个方法)
开发语言·网络·python·深度学习·测试工具
zyhomepage9 小时前
科技的成就(六十九)
开发语言·网络·人工智能·科技·内容运营
Arva .10 小时前
HTTP常见误区
网络·网络协议·http
创思通信10 小时前
4G模块 A7670发送英文短信到手机
物联网·网络协议·信息与通信
Synfuture阳途11 小时前
终端安全管理系统为什么需要使用,企业需要的桌面管理软件
网络·安全
LUCIAZZZ12 小时前
高性能网络模式-Reactor和Preactor
java·服务器·开发语言·网络·操作系统·计算机系统
k *12 小时前
网络编程-tcp连接:服务器与客户端
服务器·网络·tcp/ip
云云32112 小时前
亚矩阵云手机:破解 Yandex 广告平台多账号风控难题的利器
网络·科技·线性代数·智能手机·矩阵
枷锁—sha12 小时前
【DVWA系列】——File Upload——High详细教程(webshell工具哥斯拉)
网络·web安全·网络安全