TCP-UDP-WebSocket-组播-单播

ops/2025/3/6 7:42:54/

1. TCP 通信

TCP(Transmission Control Protocol):
特点:
面向连接,可靠传输。
保证数据顺序和完整性。
适用于需要可靠传输的场景(如文件传输、网页浏览)。

C 语言案例:
服务器端:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>#define PORT 8080
#define BUFFER_SIZE 1024int main() {int server_fd, new_socket;struct sockaddr_in address;int addrlen = sizeof(address);char buffer[BUFFER_SIZE] = {0};char *response = "Hello from server";// 创建 socketif ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {perror("Socket failed");exit(EXIT_FAILURE);}address.sin_family = AF_INET;address.sin_addr.s_addr = INADDR_ANY;address.sin_port = htons(PORT);// 绑定 socketif (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {perror("Bind failed");exit(EXIT_FAILURE);}// 监听if (listen(server_fd, 3) < 0) {perror("Listen failed");exit(EXIT_FAILURE);}// 接受连接if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {perror("Accept failed");exit(EXIT_FAILURE);}// 读取数据read(new_socket, buffer, BUFFER_SIZE);printf("Client: %s\n", buffer);// 发送响应send(new_socket, response, strlen(response), 0);printf("Response sent\n");close(new_socket);close(server_fd);return 0;
}

客户端:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>#define PORT 8080
#define BUFFER_SIZE 1024int main() {int sock = 0;struct sockaddr_in serv_addr;char *message = "Hello from client";char buffer[BUFFER_SIZE] = {0};// 创建 socketif ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {perror("Socket creation error");return -1;}serv_addr.sin_family = AF_INET;serv_addr.sin_port = htons(PORT);// 将 IP 地址从字符串转换为二进制if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) {perror("Invalid address/ Address not supported");return -1;}// 连接服务器if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {perror("Connection Failed");return -1;}// 发送数据send(sock, message, strlen(message), 0);printf("Message sent\n");// 接收响应read(sock, buffer, BUFFER_SIZE);printf("Server: %s\n", buffer);close(sock);return 0;
}

2.UDP(User Datagram Protocol)

特点:
无连接,不可靠传输。
数据包可能丢失或乱序。
适用于实时性要求高的场景(如视频流、在线游戏)。
C 语言案例:
服务器端:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>#define PORT 8080
#define BUFFER_SIZE 1024int main() {int sockfd;char buffer[BUFFER_SIZE];struct sockaddr_in servaddr, cliaddr;// 创建 socketif ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {perror("Socket creation failed");exit(EXIT_FAILURE);}memset(&servaddr, 0, sizeof(servaddr));memset(&cliaddr, 0, sizeof(cliaddr));servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = INADDR_ANY;servaddr.sin_port = htons(PORT);// 绑定 socketif (bind(sockfd, (const struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) {perror("Bind failed");exit(EXIT_FAILURE);}int len, n;len = sizeof(cliaddr);// 接收数据n = recvfrom(sockfd, (char *)buffer, BUFFER_SIZE, MSG_WAITALL, (struct sockaddr *)&cliaddr, &len);buffer[n] = '\0';printf("Client: %s\n", buffer);// 发送响应sendto(sockfd, "Hello from server", strlen("Hello from server"), MSG_CONFIRM, (const struct sockaddr *)&cliaddr, len);printf("Response sent\n");close(sockfd);return 0;
}

客户端:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>#define PORT 8080
#define BUFFER_SIZE 1024int main() {int sockfd;char buffer[BUFFER_SIZE];struct sockaddr_in servaddr;// 创建 socketif ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {perror("Socket creation failed");exit(EXIT_FAILURE);}memset(&servaddr, 0, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(PORT);servaddr.sin_addr.s_addr = INADDR_ANY;// 发送数据sendto(sockfd, "Hello from client", strlen("Hello from client"), MSG_CONFIRM, (const struct sockaddr *)&servaddr, sizeof(servaddr));printf("Message sent\n");// 接收响应int len, n;len = sizeof(servaddr);n = recvfrom(sockfd, (char *)buffer, BUFFER_SIZE, MSG_WAITALL, (struct sockaddr *)&servaddr, &len);buffer[n] = '\0';printf("Server: %s\n", buffer);close(sockfd);return 0;
}

3.WebSocket 通信

特点:
全双工通信协议,基于 TCP。
适用于实时通信场景(如聊天应用、实时数据推送)。
C 语言案例:
WebSocket 通常使用库(如 libwebsockets)实现,以下是一个简单示例:

#include <libwebsockets.h>
#include <stdio.h>
#include <string.h>static int callback_http(struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len) {return 0;
}static int callback_websocket(struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len) {switch (reason) {case LWS_CALLBACK_ESTABLISHED:printf("Connection established\n");break;case LWS_CALLBACK_RECEIVE:printf("Received data: %s\n", (char *)in);lws_write(wsi, in, len, LWS_WRITE_TEXT);break;default:break;}return 0;
}static struct lws_protocols protocols[] = {{ "http-only", callback_http, 0, 0 },{ "websocket", callback_websocket, 0, 0 },{ NULL, NULL, 0, 0 }
};int main() {struct lws_context_creation_info info;struct lws_context *context;memset(&info, 0, sizeof info);info.port = 8080;info.protocols = protocols;context = lws_create_context(&info);if (!context) {fprintf(stderr, "WebSocket context creation failed\n");return -1;}while (1) {lws_service(context, 1000);}lws_context_destroy(context);return 0;
}

(easywsclient库)

#include "easywsclient.hpp"
using namespace cv;using easywsclient::WebSocket;
static WebSocket::pointer ws = NULL;
void handle_message(const std::string & message)
{printf(">>> %s\n", message.c_str());if (message == "world") { ws->close(); }
}int main()
{
#ifdef _WIN32INT rc;WSADATA wsaData;rc = WSAStartup(MAKEWORD(2, 2), &wsaData);if (rc) {printf("WSAStartup Failed.\n");return 1;}
#endifcJSON* cjson_test = NULL;char* str = NULL;/* 创建一个JSON数据对象(链表头结点) */cjson_test = cJSON_CreateObject();/* 添加一条字符串类型的JSON数据(添加一个链表节点) */cJSON_AddStringToObject(cjson_test, "id", "0");/* 添加一条整数类型的JSON数据(添加一个链表节点) */
//    cJSON_AddNumberToObject(cjson_test, "id", "0");/* 添加一条字符串类型的JSON数据(添加一个链表节点) */cJSON_AddStringToObject(cjson_test, "image", "abc");/* 打印JSON对象(整条链表)的所有数据 */str = cJSON_Print(cjson_test);printf("JSON String:\n%s\n", str);ws = WebSocket::from_url("ws://47.100.124.211:8000/ws/ObjectDetection/");assert(ws); 判断ws对象是否为空null ,当没有连接上的时候这个对象是NULL//ws->send("hello");ws->send(str);while (ws->getReadyState() != WebSocket::CLOSED) {ws->poll();//这个函数一定要在循环里调用,发送和接收都是基于这个函数进行异步处理的ws->dispatch(handle_message);}delete ws;
#ifdef _WIN32WSACleanup();
#endifreturn 0;
}

4.组播(Multicast)通信

特点:
一对多通信,数据包发送到组播组,组内所有成员都能接收。
适用于视频直播、在线会议等场景。
C 语言案例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>#define MULTICAST_GROUP "239.0.0.1"
#define PORT 12345int main() {int sockfd;struct sockaddr_in addr;char *message = "Hello, multicast!";// 创建 socketif ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {perror("Socket creation failed");exit(EXIT_FAILURE);}memset(&addr, 0, sizeof(addr));addr.sin_family = AF_INET;addr.sin_addr.s_addr = inet_addr(MULTICAST_GROUP);addr.sin_port = htons(PORT);// 发送组播数据if (sendto(sockfd, message, strlen(message), 0, (struct sockaddr *)&addr, sizeof(addr)) < 0) {perror("Sendto failed");exit(EXIT_FAILURE);}printf("Multicast message sent\n");close(sockfd);return 0;
}

5.单播(Unicast)通信

特点:
一对一通信,数据包从发送方直接传输到接收方。
适用于大多数网络通信场景。
C 语言案例:
单播通常使用 TCP 或 UDP 实现,参考前面的 TCP/UDP 示例。

总结
TCP/UDP:分别用于可靠传输和实时传输。
WebSocket:适用于全双工实时通信。
组播:一对多通信,适合大规模数据传输。
单播:一对一通信,适用于大多数场景。


http://www.ppmy.cn/ops/163533.html

相关文章

全局异常处理器为什么不能处理过滤器异常,有那些解决方案

一、全局异常处理器无法处理过滤器异常的原因 1. 请求生命周期的不同阶段 过滤器&#xff08;Filter&#xff09;&#xff1a;过滤器是Servlet规范的一部分&#xff0c;它在请求进入Servlet容器时首先被执行。过滤器可以修改请求或响应&#xff0c;甚至可以完全终止请求处理过…

C语言中的野指针如何避免

野指针&#xff08;Dangling Pointer&#xff09;是指指向无效内存地址的指针&#xff0c;使用野指针会导致程序出现未定义行为&#xff0c;如程序崩溃、数据损坏等。以下为你详细介绍几种常见的野指针情况&#xff1a; 未初始化的指针 当你声明一个指针变量&#xff0c;但没有…

华为hcie证书有什么作用?

新盟教育 专注华为认证培训十余年 为你提供认证一线资讯&#xff01; 在当今数字化飞速发展的时代&#xff0c;ICT行业对专业人才的需求日益增长。华为HCIE证书作为华为认证体系中的最高级别认证&#xff0c;无疑是众多IT从业者追求的目标。那么&#xff0c;华为HCIE证书到底有…

探秘大尺寸 PCB 打样:猎板 PCB 解锁高精度制造密码

在当今电子产品的研发与生产领域&#xff0c;大尺寸PCB&#xff08;通常指尺寸超过600mm600mm的电路板&#xff09;凭借其强大的功能集成能力和广泛的特殊应用场景&#xff0c;逐渐成为行业关注的焦点。然而&#xff0c;其复杂的特性也对生产工艺提出了极为严苛的要求。猎板PCB…

Beyond Compare for mac v5.0.6.30713 文件对比利器 支持M、Intel芯片

Mac毒搜集到的Beyond Compare是一套超级的文件及文件夹(目录)的比较工具&#xff0c;不仅可以快速比较出两个目录的不同&#xff0c;还可以比较每个文件的内容&#xff0c;而且可以任意显示比较结果。 应用介绍 程序内建了文件浏览器&#xff0c;方便您对文件、文件夹、压缩包…

山东大学计算机科学与技术学院软件工程实验日志

--- Author: "Inori_333" Date: 2025-03-04 --- 实验一 团队建立、阅读开源软件 1.队伍创建与分工 队伍最终确定由5人组成&#xff0c;小组成员之间进行了高效的沟通&#xff0c;并确定了各自的负责的部分内容。 2.代码复现与分析 写在前面&#xff1a;由于“…

C++核心编程之Deque容器

&#x1f680; 深入浅出deque容器&#xff1a;双端队列的奇幻漂流 摘要&#xff1a;想拥有既能"头铁"插入数据&#xff0c;又能"尾行"删除元素的神奇容器吗&#xff1f;快来解锁STL中的瑞士军刀——deque容器&#xff01;本文用趣味比喻实战代码&#xff…

通义万相2.1:开启视频生成新时代

文章摘要&#xff1a;通义万相 2.1 是一款在人工智能视频生成领域具有里程碑意义的工具&#xff0c;它通过核心技术的升级和创新&#xff0c;为创作者提供了更强大、更智能的创作能力。本文详细介绍了通义万相 2.1 的背景、核心技术、功能特性、性能评测、用户反馈以及应用场景…