【Linux学习笔记52】socket编程之UDP协议

引言

TCP是一种有连接的网络协议,UDP是一种无连接的通信网络协议。两者相比之下,UDP会显得简单些。本篇笔记主要记录UDP协议的实现。

实现思路

在这里插入图片描述

  • 服务器创建套接字
  • 服务器套接字绑定ip地址以及端口号
  • 与TCP连接不同的是,UDP使用recvfrom()函数来等待接收数据,而不能使用TCP中的read()函数。因为read只有数据,没有地址。UDP每次连接都需要有地址,因此使用recvfrom()函数来接收。
  • 相对于TCP连接,UDP连接比较简单,不需要连接,实时性比较强,速度比较快。但是可靠性比较低

代码实现

server.c:

#include "head4sock.h"

int main(int argc, char const *argv[])
{
	// 创建一个UDP套接字
	int fd = Socket(AF_INET,SOCK_DGRAM,0);

  //绑定本地IP地址 和 端口
	struct sockaddr_in srvaddr;
	socklen_t len =sizeof(srvaddr);
	bzero(&srvaddr,len);

	srvaddr.sin_family=AF_INET;
	srvaddr.sin_port = htons(atoi(argv[1]));
	srvaddr.sin_addr.s_addr =htonl(INADDR_ANY);

	Bind(fd,(struct sockaddr *)&srvaddr,len);

 //接收客户端发来的信息
	char buf[SIZE];
	while (1)
	{
		bzero(buf,SIZE);
		recvfrom(fd,buf,SIZE,0,NULL,NULL);

		printf("%s",buf );
	}

	return 0;
}

client.c:

#include "head4sock.h"

int main(int argc, char const *argv[])
{
	// 创建一个UDP套接字
	int fd = Socket(AF_INET,SOCK_DGRAM,0);

  //绑定本地IP地址 和 端口
	struct sockaddr_in srvaddr;
	socklen_t len =sizeof(srvaddr);
	bzero(&srvaddr,len);

	srvaddr.sin_family=AF_INET;
 	inet_pton(AF_INET,argv[1],&srvaddr.sin_addr);//将文本的ip地址转为二进制放入addr
	srvaddr.sin_port =htons(atoi(argv[2]));


 //发送信息到服务器
	char buf[SIZE];
	while (1)
	{
		bzero(buf,SIZE);
		fgets(buf,SIZE,stdin);

		sendto(fd,buf,strlen(buf),0,(struct sockaddr *)&srvaddr,len);
	}

	return 0;
}

代码运行结果

在这里插入图片描述

发布了91 篇原创文章 · 获赞 17 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/RayCongLiang/article/details/100925318