引言
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;
}