1、函数介绍
UDP不需要连接,所以也就没有三次握手,不需要accept和connect函数,UDP主要用下面两个函数
// recvfrom函数
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
参数:
sockfd:lfd
buf: 缓冲区地址
len: 缓冲区大小
flags: 0
src_addr 传出,对端地址结构
addrlen 传入传出参数
返回值:
成功:接受数据字节数
0 对端关闭
失败: -1
// sendto函数
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);
参数:
sockfd:套接字
buf: 存储数据缓冲区地址
len: 数据大小
flags: 0
src_addr 传入,目标地址结构
addrlen 地址长度
返回值:
成功:接受数据字节数
0 对端关闭
失败: -1
2、代码
2.1、server.c
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/socket.h>
#define PORT 9999
void sys_perr(const char* str)
{
perror(str);
exit(1);
}
int main()
{
int fd = socket(AF_INET,SOCK_DGRAM,0);
if(fd == -1)
sys_perr("socket error");
struct sockaddr_in ser_addr,cli_addr;
ser_addr.sin_family = AF_INET;
ser_addr.sin_port = htons(PORT);
ser_addr.sin_addr.s_addr = htonl(INADDR_ANY);
// 绑定地址结构
bind(fd,(struct sockaddr*)&ser_addr,sizeof(ser_addr));
char buf[1024],str[INET_ADDRSTRLEN];
bzero(buf,sizeof(buf));
int n;
socklen_t clilen = sizeof(cli_addr);
while(1)
{
n = recvfrom(fd,buf,sizeof(buf),0,(struct sockaddr*)&cli_addr,&clilen);
if(n == -1)
sys_perr("recvfrom error");
// 打印客户端ip:port
printf("客户端地址:%s:%d\n",
inet_ntop(AF_INET,&(cli_addr.sin_addr.s_addr),str,sizeof(str)),
ntohs(cli_addr.sin_port));
for(int i=0;i<n;i++)
{
buf[i] = toupper(buf[i]);
}
write(STDOUT_FILENO,buf,n); // 将转位大写的写到屏幕上
// 写给对端
sendto(fd,buf,n,0,(struct sockaddr*)&cli_addr,clilen);
}
return 0;
}
2.2、client.c
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/socket.h>
#define PORT 9999
void sys_perr(const char* str)
{
perror(str);
exit(1);
}
int main()
{
int fd = socket(AF_INET,SOCK_DGRAM,0);
if(fd == -1)
sys_perr("socket error");
struct sockaddr_in ser_addr;
ser_addr.sin_family = AF_INET;
ser_addr.sin_port = htons(PORT);
inet_pton(AF_INET,"127.0.0.1",&ser_addr.sin_addr);
bind(fd,(struct sockaddr*)&ser_addr,sizeof(ser_addr));
char buf[1024],str[INET_ADDRSTRLEN];
bzero(buf,sizeof(buf));
int n;
int i=0;
while(1)
{
sprintf(buf,"hello %d\n",i++);
sendto(fd,buf,strlen(buf),0,(struct sockaddr*)&ser_addr,sizeof(ser_addr));
sleep(1);
recvfrom(fd,buf,sizeof(buf),0,NULL,0);
printf("%s\n",buf);
}
return 0;
}
版权声明:本文为weixin_45715405原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。