UDP编程函数recvfrom()、inet_pton()、sendto()
- UDP协议 user data protrol 用户数据协议特点:
TCP: 面向连接 --> 一定双方连接上了才能进行通信!
UDP: 面向非连接 --> 不需要连接就可以进行数据的收发,提高效率。
UDP例子: 写信
- UDP实现过程
例题: 客户端发送数据给服务器,使用UDP完成。
服务器:(收信) Rose.c
(1). 买一个信箱
int fd = socket(AF_INET,SOCK_DGRAM,0);
(2). 绑定一个地址到信箱
struct sockaddr_in srvaddr;
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);
(3). 不断收信
recvfrom(fd,buf,sizeof(buf),0,(struct sockaddr *)&cliaddr,&len);
(4). 销毁信箱
close(fd);
客户端:(写信)
(1). 买一个信箱
int fd = socket(AF_INET,SOCK_DGRAM,0);
(2). 准备服务器地址
struct sockaddr_in srvaddr;
socklen_t len = sizeof(srvaddr);
srvaddr.sin_family = AF_INET;
srvaddr.sin_port = htons(atoi(argv[2]));
inet_pton(AF_INET,argv[1],&srvaddr.sin_addr);
(3). 不断往服务器地址写信
sendto(fd,buf,strlen(buf),0,(struct sockaddr *)&srvaddr,len);
(4). 销毁信箱
close(fd);
例子:
Jack.c
备注:本次测试为Linux Ubuntu18.04系统,更新原文章头文件
#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 <netinet/udp.h>
#include <arpa/inet.h>
int main(int argc,char *argv[])
{
int fd = socket(AF_INET,SOCK_DGRAM,0);
struct sockaddr_in srvaddr;
socklen_t len = sizeof(srvaddr);
srvaddr.sin_family = AF_INET;
srvaddr.sin_port = htons(atoi(argv[2]));
inet_pton(AF_INET,argv[1],&srvaddr.sin_addr);
char buf[50];
while(1)
{
bzero(buf,50);
fgets(buf,50,stdin);
sendto(fd,buf,strlen(buf),0,(struct sockaddr *)&srvaddr,len);
if(strncmp(buf,"quit",4) == 0)
break;
}
close(fd);
return 0;
}
Rose.c
#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 <netinet/udp.h>
int main(int argc,char *argv[])
{
int fd = socket(AF_INET,SOCK_DGRAM,0);
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);
struct sockaddr_in cliaddr;
char buf[50];
while(1)
{
bzero(buf,50);
recvfrom(fd,buf,sizeof(buf),0,(struct sockaddr *)&cliaddr,&len);
printf("from Jack:%s",buf);
if(strncmp(buf,"quit",4) == 0)
break;
}
close(fd);
return 0;
}
运行步骤:
同桌Ubuntu 你的Ubuntu
Rose.c Jack.c
192.168.0.10 192.168.0.20
50001 50001
同桌: ping 192.168.0.20
你: ping 192.168.0.10
同桌: ./Rose 50001
你: ./Jack 192.168.0.10 50001
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)