网络编程UDP—socket实现
前言
-
UDP通信需要哪些必要信息
- IP地址
- 用于定位通讯双方
- 端口号
- 用于标识通信的具体应用或服务。
- 传输层通信都需要端口号的。
- IP地址
-
网络要求
- 双方必须是可以进行ip通信的
- UDP依赖IP协议栈(IPv4或IPv6)完成路由、传输
- 双方需要用同一协议
- 双方必须是可以进行ip通信的
UDP客户端和服务端
-
客户端
-
构造数据报:包含目标IP、目标端口、数据内容。
-
发送数据报:使用套接字 sendto() 函数将数据发送到目标地址。
-
等待响应(如果有):接收服务端返回的数据。
-
服务端
-
创建监听套接字:绑定到指定IP和端口。
-
等待数据:通过 recvfrom() 函数接收数据。
-
处理请求:解析数据内容并执行相应操作。
-
返回响应:将结果数据发送回客户端。
UDP使用场景
UDP适用于以下需要高效传输但容忍数据丢失的场景:
- 实时通信:
- 视频通话、语音通话(如VoIP)。
- 在线游戏:
- 游戏中快速同步状态。
- 流媒体传输:
- 实时视频、音频传输。
- 广播/组播:
- 数据包同时发送给多个主机(如局域网中发现服务)。
- 轻量级请求/响应:
- DNS查询、简单的远程控制。
UDP socket C++代码示例
服务端接收数据示例(bind+recvfrom 阻塞式接收信息):
- 使用场景
- 简单服务端,适用于单个套接字的接收
#include <iostream>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <cstring>
int main() {
int sock_fd = socket(AF_INET, SOCK_DGRAM, 0); // 创建UDP套接字
if (sock_fd < 0) {
perror("Socket creation failed");
return -1;
}
struct sockaddr_in server_addr;
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8080); // 监听端口
server_addr.sin_addr.s_addr = INADDR_ANY; // 监听所有网络接口
if (bind(sock_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
perror("Bind failed");
close(sock_fd);
return -1;
}
char buffer[

最低0.47元/天 解锁文章
2991

被折叠的 条评论
为什么被折叠?



