当前位置: 首页 > news >正文

5. C++网络编程-UDP协议的实现

UDP是无连接的。

UDP Server网络编程基本步骤

  • 创建socket,指定使用UDP协议
  • 将socket与地址和端口绑定
  • 使用recv/send接收/发送数据
    由于UDP是无连接的,直接侦听就行
  • 使用close关闭连接

在这里插入图片描述
这个UDP接收数据的时候用的API是recvfrom,发送数据是sendto

客户端

#include <sys/types.h>
#include <sys/socket.h>
#include <pthread.h>
#include <netinet/in.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <arpa/inet.h>int main(int argc, char * *argv)
{struct sockaddr_in addr;socklen_t addrlen = sizeof(addr);int sock;addr.sin_family     = AF_INET;addr.sin_port       = htons(9876);addr.sin_addr.s_addr = inet_addr("127.0.0.1");char buff_send[512] = "Hello";char buff_recv[512] = {0};int len = sizeof(addr);int n = 0;printf("This is a UDP client\n");if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0){printf("socket error.\n");exit(1);}if (addr.sin_addr.s_addr == INADDR_NONE){printf("Incorrect ip address!");close(sock);exit(1);}n = sendto(sock, buff_send, strlen(buff_send), 0, (struct sockaddr *) &addr, sizeof(addr));if (n < 0){printf("sendto error.\n");close(sock);}n = recvfrom(sock, buff_recv, 512, 0, (struct sockaddr *) &addr, &addrlen);if (n > 0){buff_recv[n] = 0;printf("received from sever:");puts(buff_recv);}else if (n == 0)printf("server closed.\n");else if (n == -1)printf("recvfrom error.\n");close(sock);return 0;
}

服务器端

#include <sys/types.h>
#include <sys/socket.h>
#include <pthread.h>
#include <netinet/in.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <arpa/inet.h>int main(int argc, char * *argv)
{struct sockaddr_in addr;addr.sin_family     = AF_INET;addr.sin_port       = htons(9876);addr.sin_addr.s_addr = INADDR_ANY;char buff_recv[512] = {0};char buff_send[512] = "world";struct sockaddr_in clientAddr;socklen_t addrlen = sizeof(clientAddr);int n;int len = sizeof(clientAddr);int sock;printf("Welcome! This is a UDP server.\n");if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0){printf("socket error.\n");exit(1);}if (bind(sock, (struct sockaddr *) &addr, sizeof(addr)) < 0){printf("bind error.\n");exit(1);}while (1){//ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);n = recvfrom(sock, (void *)buff_recv, 511, 0, (struct sockaddr *) &clientAddr, &addrlen);if (n > 0){buff_recv[n] = 0;printf("recv data from client:%s %u says: %s\n", inet_ntoa(clientAddr.sin_addr), ntohs(clientAddr.sin_port), buff_recv);n = sendto(sock, (void *)buff_send, n, 0, (struct sockaddr *) &clientAddr, sizeof(clientAddr));if (n < 0){printf("sendto error.\n");break;}else {printf("recv error.\n");break;}}}return 0;
}

在这里插入图片描述

http://www.lryc.cn/news/353251.html

相关文章:

  • Altium Designer 中键拖动,滚轮缩放,并修改缩放速度
  • python从入门到精通04
  • tomcat三级指导
  • 不知道是该怎么引用多个函数片段?具体示例如代码
  • P3128 [USACO15DEC] Max Flow P题解(树上差分,最近公共祖先,图论)
  • 在Linux上面部署ELK
  • Langchain-Chatchat的markdownHeaderTextSplitter使用
  • 掩码生成蒸馏——知识蒸馏
  • 【C#实战】Newtonsoft.Json基类子类解析
  • 表达式求值的相关语法知识(C语言)
  • 开发中遇到Electron自定义窗口的问题
  • c# sqlite使用
  • 39、Flink 的窗口剔除器(Evictors)详解
  • Flutter 中的 DefaultTabController 小部件:全面指南
  • C++技能进阶指南——多态语法剖析
  • Linux内存管理--系列文章肆
  • kali下载zsteg和stegpy
  • 前端面试题日常练-day34 【面试题】
  • 网站笔记:huggingface model memory calculator
  • SpringBoot2.0.x旧版集成Swagger UI报错Unable to infer base url...解决办法
  • 软件项目详细设计说明书实际项目参考(word原件下载及全套软件资料包)
  • 电脑文件qt5core.dll如何修复?如何快速的解决qt5core.dll丢失问题
  • USART串口通信(stm32)
  • 快速分析变量间关系(Boruta+SHAP+RCS)的 APP(streamlit)
  • 解决docker中container运行闪退终止的问题
  • Redis 性能管理
  • 节水“云”科普丨北京昌平VR节水云展馆精彩上线
  • linux的系统调用open, read函数(文件编程)使用demo
  • C语言基础——循环(2)+关机程序
  • cnVcXsrv 21.1.13.1—VcXsrv 21.1.13中文版本简单说明~~