Socket学习笔记(4)UDP

对于UDP来说,没有了各种乱七八糟的握手挥手,只需要直接接受处理和直接发送就好了。

Server端

  • 1、创建套接字
  • 2、绑定本机信息
  • 3、从哪里接收到信息
  • 4、发送信息到接收的信息的地址
    对于创建套接字和绑定本地信息,在笔记2、3有所体现。
    从哪里接收到的信息所使用的函数:
ssize_t recvfrom(int sockfd,void *buf,size_t nvytes,int flages,struct sockaddr *from ,socklen_t *addrlen);

sockfd : 套接字
buf:接收数据缓冲区
nbytes :接收数据缓冲区大小
flags : 套接字标志
from : 用于存放发送方的信息的地址结构体指针
addlen : from 所指内容的长度
返回接收成功的字节数,失败-1

ssize_t sendto(int sockfd,const void * buf,size_t nbytes,int flags,const struct sockaddr *to,socklen_t addrlen);

sockfd : 套接字
buf:发送数据缓冲区
nbytes :发送数据缓冲区大小
flags : 套接字标志
to : 用于存放要发送给谁的那个人的的地址结构体指针
addlen : to 所指内容的长度
返回接收发送的字节数,失败-1

代码例子:

while(1){
	char recv_buf[1024];
	char cli_ip[INET_ADDRSTRLEN] = "";
	int recv_len = 0;
	struct sockaddr_in client_addr;
	socklen_t client_addr_len = sizeof(client_addr);

	recv_len = recvfrom(sockfd,recv_buf,sizeof(recv_buf),0,(struct sockaddr*)&clien_addr,&client_addr_len);
	
	inet_ntop(AF_INET,&client_addr.sin_addr,cli_ip,INET_ADDRSTRLEN);
	printf("client ip = %s\n",cli_ip);

	sendto(sockfd,recv_buf,recv_len,0,(struct sockaddr*)&client_addr,client_addr_len);
}
close(sockfd);

传过来的不仅是数据还有发送方的结构体

客户端

1、创建套接字
2、发送数据
3、接收数据
4、关闭

-发送数据和接收数据的函数都是一个函数,recvfrom和sendto

但是要在发送之前创建一个地质结构体,目的是给哪个发送。作为一个客户端,必须是给服务器进行发送的。所以这个地址结构体的作用就是存放服务器的信息。需要注意的是,对于客户端来说是接收数据,并且不关心数据的来源的。所以recvfrom函数里面的参数的addr地址是空,长度也是空。

广播

使用的函数为
int setsockopt(int sockfd,int level,int optname,const void *optval,socklen_t optlen);
其中的level 填写SOL_SOCKET
optname有三个选项
1、SO_BROADCAST,允许发送广播数据包。
2、SO_RCVBUF ,接收缓冲区大小
3、SO_SNDBUF ,发送缓冲区大小
optval的意思是分别对optname的三个选项进行控制。
1、对于第一个允许发送广播数据包来说,1就是可以,0就是不行。
2、对于第二个来说设置的大小就是缓冲区的大小。
optlen的含义就是optval的长度。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值