TCP是一种面向连接的、可靠数据包传输,采取丢包重传的方式进行数据的传输通信。
优点: 稳定:数据流量稳定、传输速度稳定、传输数据包的顺序稳定。
缺点: 传输速度慢,传输效率低,系统资源开销大。
**应用领域:**追求准确但不需要效率的场景。
UDP是一种无连接的不可靠的数据报传递,传输过程中如果发生数据丢失,不会管它
优点: 传输速度快、效率高、系统资源开销小。
缺点: 数据流量不稳定,传输速率不稳定,数据传递的顺序不一定准确。
应用领域: 时效性要求高但是准确率不一定要求高的场景,比如:视频通话、直播等。
int socket(int domain, int type, int protocol);
//创建网络通信套接字
//domain:网络通信协议:AF_INET(IPv4),AF_INET6(IPv6)
//type:传输数据的类型,此处和TCP通信不同,应该选择UDP的报式通信方式:SOCK_DGREAM
//protocol:默认为0
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
//绑定地址结构和套接字
//UDP通信不需要Listen函数和accept函数,因为不需要进行连接
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t *addrlen);
//接收对端传递来的数据
//sockfd:本端创建的网络套接字
//buf:接收数据用的数组,为传出参数,读取到的数据存放于buf中
//len:接收数据的数组长度
//flags:接收标志,一般设置为0
//src_addr:对端地址结构
//addrlen:对端地址结构长度
//返回值:读取到的数据长度;失败返回-1
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);
//向对端发送数据
//sockfd:本端创建的套接字
//buf:要发送的数据
//len:从 buf 中发送多少个字节
//flags:发送状态,一般设置为0
//dest_addr:对端地址结构
//addrlen:对端地址结构长度
//返回值:成功则返回实际传送出去的字符数;失败返回-1
#include
#include
#include
#include
#define SERV_PORT 9999
using namespace std;
int main()
{
int lfd = socket(AF_INET, SOCK_DGRAM, 0);
if(lfd == -1)
{
perror("UDP_socket error");
exit(1);
}
struct sockaddr_in serv_addr;
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(SERV_PORT);
int ret = inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr.s_addr);
if(ret <= 0)
{
perror("inet_pton error");
exit(1);
}
bind(lfd,(sockaddr*)&serv_addr, sizeof(serv_addr));
struct sockaddr_in client_addr;
socklen_t client_addr_len = sizeof(client_addr);
char buf[1024];
while(1)
{
int nread = recvfrom(lfd, buf, sizeof(buf), 0, (sockaddr*)&client_addr, &client_addr_len);
if(nread == -1)
{
perror("recvfrom error");
exit(1);
}
else if(nread == 0)
{
close(lfd);
break;
}
else if (nread > 0)
{
for (int i = 0; i < nread; i++)
{
buf[i] = toupper(buf[i]);
}
sendto(lfd, buf, nread, 0, (sockaddr*)&client_addr, client_addr_len);
}
}
return 0;
}
#include
#include
#include
#include
#define SERV_PORT 9999
using namespace std;
int main()
{
int client_lfd = socket(AF_INET, SOCK_DGRAM, 0);
if(client_lfd == -1)
{
perror("client socket error");
exit(1);
}
struct sockaddr_in serv_addr;
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(SERV_PORT);
serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
socklen_t serv_addr_len = sizeof(serv_addr);
char buf[1024];
while(1)
{
int ret = read(STDIN_FILENO, buf, sizeof(buf));
if(ret == -1)
{
perror("read error");
close(client_lfd);
exit(1);
}
ret = sendto(client_lfd, buf, ret, 0, (sockaddr*)&serv_addr, serv_addr_len);
if(ret == -1)
{
perror("sendto error");
close(client_lfd);
exit(1);
}
int ret1 = recvfrom(client_lfd, buf, sizeof(buf), 0, (sockaddr*)&serv_addr, &serv_addr_len);
if(ret1 == -1)
{
perror("recvfrom error");
close(client_lfd);
exit(1);
}
write(STDOUT_FILENO, buf, ret1);
}
return 0;
}