首页 > 编程语言 >C++ - UDP通信

C++ - UDP通信

时间:2023-04-20 12:12:26浏览次数:35  
标签:SOCKADDR UDP sendBuf err 通信 C++ wsaData wVersion addrSrv

UDP

UDP就比较简单了,步骤比tcp要少一些。

连接过程图:

 

 

1). 服务器

1.初始化套接字库

WORD wVersion;
WSADATA wsaData;
int err;
​
wVersion = MAKEWORD(1, 1);

2.创建套接字

SOCKET sockSrv = socket(AF_INET, SOCK_DGRAM, 0);

3.绑定

// SOCKADDR_IN addrSrv; 省略了定义和赋值
bind(sockSrv, (SOCKADDR *)&addrSrv, sizeof(SOCKADDR));

4.接收数据

char recvBuf[100];
recvfrom(sockSrv, recvBuf, 100, 0, (SOCKADDR *)&addrCli, &len);

5.发送数据

char sendBuf[] = "hello Client,I'm Server!\n";
sendto(sockSrv, sendBuf, strlen(sendBuf) + 1, 0, (SOCKADDR *)&addrCli, len);

6.关闭

closesocket(sockSrv);
WSACleanup();

 

服务器具体实现代码:

#include <WinSock2.h>
#include <iostream>
​
#pragma comment(lib, "ws2_32.lib")
​
int main(void) {
    // 初始化套接字库
    WORD wVersion;
    WSADATA wsaData;
    int err;
​
    wVersion = MAKEWORD(1, 1);
    err = WSAStartup(wVersion, &wsaData);
    if (err != 0) {
        return err;
    }
​
    if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1) {
        WSACleanup();
        return -1;
    }
​
    // 创建套接字
    SOCKET sockSrv = socket(AF_INET, SOCK_DGRAM, 0);
​
    SOCKADDR_IN addrSrv;
    addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    addrSrv.sin_family = AF_INET;
    addrSrv.sin_port = htons(6001);
​
    // 绑定到本机6001端口
    bind(sockSrv, (SOCKADDR *)&addrSrv, sizeof(SOCKADDR));
​
    // 接收请求,处理请求
    SOCKADDR_IN addrCli;
    int len = sizeof(SOCKADDR);
​
    char sendBuf[] = "hello Client,I'm Server!\n";
    char recvBuf[100];
​
    std::cout << "start UDP server with port 6001" << std::endl;
    while (1) {
        // 接收数据
        recvfrom(sockSrv, recvBuf, 100, 0, (SOCKADDR *)&addrCli, &len);
        std::cout << "Recv:" << recvBuf << std::endl;
​
        // 发送数据
        sendto(sockSrv, sendBuf, strlen(sendBuf) + 1, 0, (SOCKADDR *)&addrCli, len);
        std::cout << "Send:" << sendBuf << std::endl;
    }
​    // 关闭
    closesocket(sockSrv);
    WSACleanup();
​
    return 0;
}
​

 

2). 客户端

1.初始化套接字库

WORD wVersion;
WSADATA wsaData;
int err;
​
wVersion = MAKEWORD(1, 1);

2.创建UDP套接字

SOCKET sockCli = socket(AF_INET, SOCK_DGRAM, 0);
SOCKADDR_IN addrSrv;

3.接收数据

char recvBuf[100];
recvfrom(sockCli, recvBuf, 100, 0, (SOCKADDR *)&addrCli, &len);

4.发送数据

char sendBuf[] = "hello Client,I'm Server!\n";
sendto(sockCli, sendBuf, strlen(sendBuf) + 1, 0, (SOCKADDR *)&addrSrv, len);

5.关闭

closesocket(sockSrv);
WSACleanup();

 

客户端具体实现代码:

#include <WinSock2.h>
#include <iostream>
​
#pragma comment(lib, "ws2_32.lib")
​
​
int main(void) {
​
    // 初始化套接字库
    WORD wVersion;
    WSADATA wsaData;
    int err;
​
    wVersion = MAKEWORD(1, 1);
    err = WSAStartup(wVersion, &wsaData);
    if (err != 0) {
        return err;
    }
​
    if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1) {
        WSACleanup();
        return -1;
    }
​
    // 创建UDP套接字
    SOCKET sockCli = socket(AF_INET, SOCK_DGRAM, 0);
    SOCKADDR_IN addrSrv;
    addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    addrSrv.sin_family = AF_INET;
    addrSrv.sin_port = htons(6001);
​
    SOCKADDR_IN addrCli;
    int len = sizeof(SOCKADDR);
​
    char sendBuf[] = "hello, I'm Client!\n";
    char recvBuf[100];
​    // 发送数据
    std::cout << "send to Server: " << sendBuf << std::endl;
    sendto(sockCli, sendBuf, strlen(sendBuf) + 1, 0, (SOCKADDR *)&addrSrv, len);
​    
    // 接收数据
    recvfrom(sockCli, recvBuf, 100, 0, (SOCKADDR *)&addrCli, &len);
    std::cout << "recv from: " << recvBuf << std::endl;
​
​    // 关闭
    closesocket(sockCli);
    WSACleanup();
​
    system("pause");
    return 0;
}
​

 

运行效果:

 

总结

socket的具体细节用法我不太清楚,现阶段也只是熟悉TCP的一些简单操作,UDP的话也还不是太懂,不懂的是不知道在具体项目中该如何进行使用它们。 那个TCP的小项目也只是自己琢磨搞出来的,不知掉具体项目会不会这样去写!

 

标签:SOCKADDR,UDP,sendBuf,err,通信,C++,wsaData,wVersion,addrSrv
From: https://www.cnblogs.com/zhuchunlin/p/17336316.html

相关文章

  • C++ - TCP通信
    前言socket编程分为TCP和UDP两个模块,其中TCP是可靠的、安全的,常用于发送文件等,而UDP是不可靠的、不安全的,常用作视频通话等。如下图:头文件与库:#include<WinSock2.h>​#pragmacomment(lib,"ws2_32.lib")准备工作:创建工程后,首先右键工程,选择属性然后选择C/C++-预......
  • 使用 OpenCV4 和 C++ 构建计算机视觉项目:1~5
    原文:BuildingComputerVisionProjectswithOpenCV4andC++协议:CCBY-NC-SA4.0译者:飞龙本文来自【ApacheCN计算机视觉译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。当别人说你没有底线的时候,你最好真的没有;当别人说你做过某些事的时候,你也最好真的做过。一、Open......
  • c++输出格式控制
    一.控制符需要<iomanip>头文件常用:1.保留几位有效数字:setpricision(),括号里是保留的位数2.保留几位小数:setiosflags(ios::fixed)<<setpricision(),括号里是保留的位数(注意前面半句会影响此后所有setpricision()的用法,都变成保留小数位数,不只是这一句)(直接把前半句改成......
  • 刚开始如何模仿写C/C++程序的Makefile
    对于一般工程的C/C++程序,在利用Makefile文件对其进行编译遵守下面两个规则即可:即编写的Makefile文件中,不论最后的是库文件还是可执行文件。gcc通过-c选项,将所有的文件都编译成目标代码文件即可.o文件。之后通过将所有的.o文件链表得到一个可执行文件,或者库文件。......
  • 企业内部即时通信软件都有哪些?
    随着互联网的发展,企业内部的沟通方式也在不断变化,从通过传真、电话、邮件等方式转变为通过即时通信软件来沟通协作。但许多企业内部还是使用QQ、微信等个人社交即时通信软件,这些软件虽然在一定程度上能解决企业内部部分沟通协作的需求,但效率的提升却不足,企业想要更好的提升沟通协......
  • BOM-跨源通信
    WindowpostMessage()方法|菜鸟教程(runoob.com)1、介绍otherWindow.postMessage(message,targetOrigin,[transfer]);otherWindow其他窗口的一个引用,比如iframe的contentWindow属性、执行window.open返回的窗口对象、或者是命名过或数值索引的window.frames。m......
  • 基于UDP协议的Socket通信
    TCP和UDP最大的区别在于是否需要客户端与服务端建立连接后才能进行数据传输,如果你学习前面的TCP,传输前先开服务端,accept,等客户端接入,然后获得客户端socket然后进行IO操作,而UDP则不用,UDP以数据报作为数据的传输载体,在进行传输时首先要把传输的数据定义成数据报(Datagram),在数据报中......
  • 打卡 上课铃响之后 - C/C++ 多态
    如本章开篇所述,当小学里的上课铃响之后,学生(Student)、教师(Teacher)和校长(Principal)会对同一个消息表现出不同的行为。请设计Person、Student、Teacher以及Principal类,合理安排他们之间的继承关系并将所有类的bellRing()及析构函数设计为虚函数,使得下述代码可以正常执行并产生期望的......
  • 初学者代码训练Day3(c/c++)
    题目中国古代数学家张丘建在他的《算经》中提出了一个著名的“百钱百鸡问题”:一只公鸡值五钱,一只母鸡值三钱,三只小鸡值一钱,现在要用百钱买百鸡,请问公鸡、母鸡、小鸡各多少只? 流程图: 代码:1#include<iostream>2usingnamespacestd;3intmain()4{intgongji,mu......
  • C++第三章课后习题3-15
    编写递归函数getPower计算x的y次方,在同一个程序中针对整形和实数型实现两个重载的函数。#include<iostream>usingnamespacestd;intgetPower(intx,inty){if(y<0){return0;}if(y==0){return1;}if(y>0){......