C++网络编程

网络通信socket

套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议栈进行交互的接口

计算机是通过TCP/IP协议进行互联从而进行通信的,为将TCP/IP协议进行隐藏,引出套接字这个概念

套接字可以看成【IP地址+端口号】
套接字提供了流套接字数据报套接字两种组合

  1. 流套接字基于TCP(stream)
  2. 数据报套接字基于UDP(datagram)
    在这里插入图片描述
    流程
    在这里插入图片描述
    在Windows环境下进行开发套接字系统
    WinSock DLL

注:在使用时一定要包含

#pragma comment(lib,"ws2_32.lib")
int WSAStartup(
WORD wVersionRequested,              //调用者能使用的Windows Socket支持的最高版本。高位指定副版本,低位指定主版本号
LPWSADATA lpWSAData                   //指向WSADATA的指针,用于接收Windows Socket的实现细节
);//该函数在一个进程中初始化WS2_32.dll的使用

服务器端

#include<WinSock2.h>
#include<iostream>
#include<string>
#include<ctime>
#include<thread>
using namespace std;
#pragma comment(lib,"ws2_32.lib")void sendMsg(int cli_sock) {//发送消息string msg = "<html><head></head><body>Hello World!</body></html>";string httpHeader = "";httpHeader += "HTTP/1.1 200 OK\r\n";httpHeader += "Content-Type:text/html;charset-UTF-8\r\n";httpHeader += "Content-Length:" + sizeof(msg);httpHeader += "\r\n";httpHeader += "\r\n";//消息头与消息之间需要有一个空行httpHeader += msg;//httpHeader += "\r\n";const char *tem = httpHeader.c_str();int ret = send(cli_sock, tem, sizeof(tem), 0);if (ret > 0) {cout << "发送成功!" << endl;}else {cout << "ERROR" << endl;}
}int main() {WSADATA data;if (WSAStartup(MAKEWORD(2, 2), &data)==-1) {cout << "初始化错误!" << endl;WSACleanup();return -1;}SOCKET m_sock = socket(AF_INET, SOCK_STREAM, 0);sockaddr_in addr;addr.sin_family = AF_INET;addr.sin_port = htons(8081);addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);if (::bind(m_sock, (sockaddr*)&addr, sizeof(addr))==-1) {cout << "bind error!" << endl;return -1;}if (listen(m_sock, SOMAXCONN)==-1) {cout << "listen error" << endl;return -1;}cout << "等待客户端连接..." << endl;sockaddr_in cli_addr;int len = sizeof(cli_addr);int cli_sock = accept(m_sock, (sockaddr*)&cli_addr, &len);//阻塞等待客户端的连接if (cli_sock == -1) {cout << "accept error";return -1;}cout << "客户端[" << cli_sock << "]已连接" << endl;//输出收到的信息char buf[32] = { 0 };recv(cli_sock, buf, sizeof(buf), 0);cout << "收到的消息为:" << buf << endl;sendMsg(cli_sock);//thread ts(sendMsg, cli_sock);//ts.detach();//Sleep(3000);//WSACleanup();system("pause");return 0;
}

客户端

#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include<WinSock2.h>
#include<iostream>
#include<string>
#include<ctime>
#include<thread>
using namespace std;
#pragma comment(lib,"ws2_32.lib")void sendMsg(int cli_sock) {//发送消息string msg = "<html><head></head><body>Hello World!</body></html>";string httpHeader = "";httpHeader += "HTTP/1.1 200 OK\r\n";httpHeader += "Content-Type:text/html;charset-UTF-8\r\n";httpHeader += "Content-Length:" + sizeof(msg);httpHeader += "\r\n";httpHeader += "\r\n";//消息头与消息之间需要有一个空行httpHeader += msg;//httpHeader += "\r\n";const char *tem = httpHeader.c_str();int ret = send(cli_sock, tem, sizeof(tem), 0);if (ret > 0) {cout << "发送成功!" << endl;}else {cout << "ERROR" << endl;}
}
int main() {//初始化WSADATA data;if (WSAStartup(MAKEWORD(2, 2), &data) == -1) {cout << "初始化错误!" << endl;WSACleanup();return -1;}//创建套接字SOCKET m_sock = socket(AF_INET, SOCK_STREAM, 0);//指定通信的ip和端口sockaddr_in addr;addr.sin_family = AF_INET;addr.sin_port = htons(8081);addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//向服务器发起连接请求if (connect(m_sock, (sockaddr*)&addr, sizeof(addr)) == -1) {cout << "bind error!" << endl;return -1;}cout << "服务器连接成功..." << endl;//接收数据char buf[32] = { 0 };recv(m_sock, buf, sizeof(buf), 0);if (buf) {cout << "收到的消息为:" << buf << endl;}//发送数据sendMsg(m_sock);//关闭socket连接,释放资源WSACleanup();system("pause");return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/540540.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从零开始的LLaMA-Factory的指令增量微调

大模型相关目录 大模型&#xff0c;包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步&#xff0c;扬帆起航。 大模型应用向开发路径及一点个人思考大模型应用开发实用开源项目汇总大模型问答项目…

chatgpt4.0开通方法,wildcard邀请码

第一步&#xff0c;先开通一个wildcard账户&#xff0c;这个是虚拟信用卡&#xff0c;可以通过支付宝充值&#xff0c;地址&#xff1a; 三达不溜点bewildcard点com&#xff0c;开卡是需要付费的&#xff0c;11.99美刀一个月&#xff0c;输入邀请码优惠两刀&#xff0c;这里提…

【HyperLips:】数字人——控制嘴唇 项目源码python实现

最近受到商汤“复活”汤晓鸥的视频刺激&#xff0c;大大的amazing&#xff01;没看过的小伙伴可以自行百度&#xff0c;看了不研究一下【数字人】技术&#xff0c;都要跟时代脱轨了&#xff0c;那就以HyperLips为开篇吧。 目录 &#x1f34e;&#x1f34e;1.摘要 &#x1f3…

【黑马程序员】Python文件、异常、模块、包

文章目录 文件操作文件编码什么是编码为什么要使用编码 文件的读取openmodel常用的三种基础访问模式读操作相关方法 文件的写入注意代码示例 异常定义异常捕获捕获指定异常捕获多个异常捕获所有异常异常else异常finally 异常的传递 python 模块定义模块的导入import模块名from …

必备工具:Postman Newman 详解

Postman Newman 是什么&#xff1f; Postman Newman 是一个 CLI&#xff08;命令行界面&#xff09;工具&#xff0c;可以使用它来运行 Postman 中的集合&#xff08;Collection&#xff09;和环境&#xff08;Environment&#xff09;进行自动化测试。它是 Postman 的命令行 …

运营干货 | TikTok店铺引流就看这几点

在 TikTok 上进行店铺引流可以是一种非常有效的营销策略&#xff0c;尤其是针对年轻用户群体。以下是一些在 TikTok 上进行店铺引流的技巧&#xff1a; 创作有趣的内容&#xff1a;在 TikTok 上&#xff0c;有趣和创意的内容往往更容易引起用户的注意。制作与你的品牌或产品相…

Arcgis新建位置分配求解最佳商店位置

背景 借用Arcgis帮助文档中的说明:在本练习中,您将为连锁零售店选择可以获得最大业务量的商店位置。主要目标是要将商店定位在人口集中地区附近,因为这种区域对商店的需求量较大。设立这一目标的前提是假设人们往往更多光顾附近的商店,而对于距离较远的商店则较少光顾。您…

Diffblue生成单元测试

什么是Diffblue Diffblue Cover 是一个强化学习 AI 平台&#xff0c;可自动编写全面的、类似人类的 Java 单元测试&#xff0c;从而节省开发人员时间、提高测试覆盖率并降低回归风险。Cover 以 IntelliJ IDE 插件&#xff08;Cover Plugin&#xff09;、CLI 应用程序&#xff…

三维铁木辛柯梁Matlab有限元编程 | 弹簧支座 | 弹性支撑单元| Matlab源码 | 理论文本

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…

Dev C++和Visual Studio Code哪个好?

Dev C和Visual Studio Code哪个好&#xff1f; Dev C和Visual Studio Code都是常用的集成开发环境&#xff08;IDE&#xff09;&#xff0c;用于编写和调试代码。它们各自有不同的优点和适用场景。 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「C的资…

副业搞米第2期|副业教程限时分享,早点保存到自己网盘

如果您想获取全部详细视频教程&#xff0c;请关注文章底部公众号&#xff0c;回复关键词【aizd】获取 AI治愈系动态壁纸文案 此教程市场价值688 壁纸创作一直是一个经久不衰的领域&#xff0c;持续走红多年。虽然展现形式不断变化&#xff0c;但AI制作的图片、温馨文案和背景…

【Python开发环境】卸载PyCharm Professional——《跟老吕学Python编程》附录资料

【Python开发环境】卸载PyCharm Professional——《跟老吕学Python编程》附录资料 在Windows卸载PyCharm Professional打开设置打开应用面板找到PyCharm确认卸载卸载选项耐心等候卸载完成Windows卸载PyCharm总结&#xff08;WindowsXP、WinVista、Win7、Win8、Win10、Win11&…