Linux网络编程——UDP编程

本文详细介绍了UDP编程的关键函数,如socket、bind、sendto、recvfrom和close,通过实际案例展示了如何在服务器端与客户端间实现数据交互。重点讲解了UDP的无连接特性及其与TCP的区别。
摘要由CSDN通过智能技术生成


前言

1、UDP通信协议,服务器端和客户端无需建立连接,只需要知道对方套接字的地址信息就可以发送数据
2、UDP通信流程图:
在这里插入图片描述

一、udp编程相关函数

1、socket函数

功能:创建套接字并返回套接字描述符

头文件:
#include<sys/socket.h>
函数原型:
int socket(int family,int type,int protocol)
参数:
family:协议族
		AF_INET:IPv4协议
		AF_INET6:IPv6协议
type:套接字类型
		SOCK_STREAM:流式套接字(tcp)
		SOCK_DGRAM:数据报套接字(udp)
protocol:0
返回值:
非负套接字描述符

2、bind函数

功能:将套接字与IP地址和端口号绑定

头文件:
#include<sys/socket.h>
函数原型:
int bind(int sockfd,(struct sockaddr *)my_addr,int addrlen)
参数:
sockfd:套接字描述符
my_addr:绑定的地址
addrlen:地址长度

3、sendto函数

功能:发送数据

头文件:
#include<sys/socket.h>
函数原型:
int send(int sockfd,const void *buf,int len,int flags,const struct sockaddr *to,int tolen);
参数:
sockfd:套接字描述符
buf:发送缓存区的地址
len:发送数据的长度
flags:一般为0
to:接收方套接字的ip地址和端口号
tolen:地址长度
返回值:
实际发送的字节数

4、recvfrom函数

功能:接收数据

头文件:
#include<sys/socket.h>
函数原型:
int recv(int sockfd,void *buf,int len,unsigned int flags,const struct sockaddr *from,int fromlen)
参数:
sockfd:套接字描述符
buf:存放接收数据的缓存区的地址
len:接收数据的长度
flags:一般为0
from:发送方的ip地址和端口号
fromlen:地址长度
返回值:
实际接收的字节数

5、close函数

功能:关闭套接字

头文件:
#include<sys/socket.h>
函数原型:
int close(int sockfd)
参数:
sockfd:套接字描述符

二、实际案例

1、代码功能:两个进程可以相互收发数据
2、实现需要开启两个终端,同时运行相同的代码,一端发送,一端接收

#include <arpa/inet.h>
#include <sys/socket.h>
#include <pthread.h>
#include <stdio.h>
struct sockaddr_in my_addr;//定义本段代码套接字
struct sockaddr_in to_addr;//定义另一端代码套接字
int fd;//定义套接字描述符
void *send_fun(void *p)//处理发送功能的线程函数
{
	char buf[100] = { 0 };
	while(1)
	{
		gets(buf);//输入字符串
		sendto(fd, buf, 100, 0, (struct sockaddr*)&to_addr, 16);//发送数据
	}
}
int main(int argc, char *argv[])
{
	pthread_t id;//线程id
	fd = socket(AF_INET, SOCK_DGRAM, 0);//套接字fd赋值
	my_addr.sin_family = AF_INET;
	my_addr.sin_port = htons(atoi(argv[3]));	//argv[3] 自己的端口号  9999
	my_addr.sin_addr.s_addr = htonl(INADDR_ANY);	//inet_addr("192.168.31.252");  INADDR_ANY 得到当前计算机的ip地址
	bind(fd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr));//绑定自己的ip地址和端口号

	to_addr.sin_family = AF_INET;
	to_addr.sin_port = htons(atoi(argv[2]));	//argv[2]对方的端口号  8888
	to_addr.sin_addr.s_addr = inet_addr(argv[1]);	//argv[1]对方的ip地址  127.0.0.1

	pthread_create(&id, NULL, send_fun,NULL);//创建线程
	while(1)
	{
		char buf[100];
		int len = 16;
		recvfrom(fd, buf, 100, 0, (struct sockaddr *)&to_addr, &len);//接收数据
		printf("from %d:%s\n", ntohs(to_addr.sin_port), buf);//输出对方的IP地址和端口号
	}	
}

结果展示
可以实现相互发送数据的两端:
1、127.0.0.1是环回地址
2、8888和9999是两端套接字地址的端口号
在这里插入图片描述
在这里插入图片描述

总结

1、UDP通信是不可靠的,其中一点是没有建立连接机制,使用ip地址进行数据的传输
2、UDP和TCP主要在于sendto和recvfrom两个函数,这两个函数参数包括了对方的ip地址和端口号,这点与TCP通信区别较大

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值