服务器和客户端简单通信的流程,做一个简单的复习:

1.服务器创建的流程



代码如下,各个重要函数已经写注释:

#include <iostream>
// 推荐加上宏定义 #define WIN32_LEAN_AND_MEAN
#include <winsock2.h>
#include <Windows.h>
#pragma comment(lib, "ws2_32")
using namespace std;
int main()
{
auto _is_good = [](bool flag, string str)
{
if (!flag)
cout << str << " successfully" << endl;
else
cout << str << " failure" << endl;
};
char info[] = "hello";
// 创建 Windows Sockets 2.x版本
WORD ver = MAKEWORD(2, 2);
// 初始化 Windows Sockets 库
// WSAStartup() 函数用于初始化 Windows Sockets 库。
// ver 参数指定 Windows Sockets 版本号,dat 参数用于接收 Windows Sockets 库的初始化信息。
WSADATA dat; // Socket的各种数据结构
WSAStartup(ver, &dat);
//---------------------------------
// 1socket API建立简易Tcp服务端
// 建立一个socket数据类型
// AF_NET是ipv4,SOCK_STREAM代表流式socket,IPPROTO_TCP代表了TCP协议
SOCKET _sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // 2bind绑定用于接受客户端连接的网络端口
sockaddr_in _sin = {}; // 表示socket地址,储存端口号和ip
_sin.sin_family = AF_INET; // 设置地址族为ipv4
_sin.sin_port = htons(4567); // 设置端口号4567,需要htons将主机字节顺序转换成为网络字节顺序
_sin.sin_addr.S_un.S_addr = INADDR_ANY; // 设置地址为任意地址
// 将套接字绑定在指定的地址和端口上
bool flag = (bind(_sock, (sockaddr *)&_sin, sizeof(_sin)) == SOCKET_ERROR);
_is_good(flag, "bind");
// 3listen监听网络端口
// 让套接字进入监听状态,缓冲区最大排队数量为5
flag = listen(_sock, 5) == SOCKET_ERROR;
_is_good(flag, "listen"); sockaddr_in clientAddr = {}; // 创建客户端ip
int nAddrLen = sizeof(sockaddr_in);
SOCKET _cSock = INVALID_SOCKET; // 给客户端创建一个套接字,客户端套接字句柄初始化为无效套接字 while (1)
{ // 4accept等待接受客户端连接
_cSock = accept(_sock, (sockaddr *)&clientAddr, &nAddrLen); // 返回值给客户端socket
flag = (INVALID_SOCKET == _cSock); // 判断是否接受到无效客户端socket
_is_good(flag, "accept");
cout << "新客户端加入:IP=" << inet_ntoa(clientAddr.sin_addr) << endl;
// 5send向客户端发送一条数据
send(_cSock, info, strlen(info) + 1, 0);
// send函数
// ssize_t send(int socket, const void *buf, size_t len, int flags);
// 参数说明: // socket:指定发送端套接字描述符。
// buf:指向一个存放应用程序要发送数据的缓冲区。
// len:指定要发送的数据长度。
// flags:指定发送数据的标志。
// send函数的返回值: // 成功时,返回实际发送的数据长度。
// 失败时,返回SOCKET_ERROR。
}
// 6关闭套接字close socket
closesocket(_sock);
//---------------------------------
// 清理 Windows Sockets 库 WSACleanup() 函数用于清理 Windows Sockets 库。
WSACleanup();
return 0;
}

2.客户端创建的流程

#include <iostream>
// 推荐加上宏定义 #define WIN32_LEAN_AND_MEAN
#include <winsock2.h>
#include <Windows.h>
#pragma comment(lib, "ws2_32")
using namespace std;
int main()
{
auto func = [](bool flag, string str)
{
if (!flag)
cout << str << " successfully" << endl;
else
cout << str << " failure" << endl;
};
char ipaddr[] = "127.0.0.1";
WORD ver = MAKEWORD(2, 2);
WSADATA dat;
WSAStartup(ver, &dat);
// 创建一个socket
SOCKET _sock = socket(AF_INET, SOCK_STREAM, 0);
bool flag = _sock == INVALID_SOCKET;
func(flag, "socket");
// 创建连接到服务器端的地址
sockaddr_in _sin = {};
_sin.sin_family = AF_INET;
_sin.sin_port = htons(4567);
_sin.sin_addr.S_un.S_addr = inet_addr(ipaddr);
// 连接服务器端
int ret = connect(_sock, (sockaddr *)&_sin, sizeof(sockaddr_in));
flag = ret == SOCKET_ERROR;
func(flag, "connect");
// 接受服务器消息
char recvBuf[256] = {};
int recvLen = recv(_sock, recvBuf, 256, 0);
/*
recv函数
recv函数用于从TCP连接的另一端接收数据。
recv函数的函数原型如下
C
ssize_t recv(int socket, void *buf, size_t len, int flags); 参数说明: socket:指定接收端套接字描述符。
buf:指向一个存放应用程序要接收数据的缓冲区。
len:指定要接收的数据长度。
flags:指定接收数据的标志。
recv函数的返回值: 成功时,返回实际接收到的数据长度。
失败时,返回SOCKET_ERROR。
*/
if (recvLen > 0)
cout << recvBuf << endl;
// 关闭socket
closesocket(_sock);
WSACleanup();
return 0;
}

3简单演示:

服务器的启动



双击客户端程序



服务器端接受到相应



多点击几次客户端后服务器端

C++socket服务器与客户端简单通信流程的更多相关文章

  1. Ajax跨域问题及解决方案 asp.net core 系列之允许跨越访问(Enable Cross-Origin Requests:CORS) c#中的Cache缓存技术 C#中的Cookie C#串口扫描枪的简单实现 c#Socket服务器与客户端的开发(2)

    Ajax跨域问题及解决方案   目录 复现Ajax跨域问题 Ajax跨域介绍 Ajax跨域解决方案 一. 在服务端添加响应头Access-Control-Allow-Origin 二. 使用JSONP ...

  2. c#Socket服务器与客户端的开发(1)

    上个项目中用到了Socket通讯,项目中直接借助SuperSocket实现,但是我觉得这毕竟是一个我没接触过的东西,所以也顺便学习了一下原生socket的使用,做了一个socket服务器与客户端的开发 ...

  3. 异步Socket服务器与客户端

      本文灵感来自Andre Azevedo 在CodeProject上面的一片文章,An Asynchronous Socket Server and Client,讲的是异步的Socket通信. S ...

  4. 基于 HTML5 WebGL 的 3D 服务器与客户端的通信

    这个例子的初衷是模拟服务器与客户端的通信,我把整个需求简化变成了今天的这个例子.3D 机房方面的模拟一般都是需要鹰眼来辅助的,这样找产品以及整个空间的概括会比较明确,在这个例子中我也加了,这篇文章就算 ...

  5. Socket通信——服务器和客户端相互通信

    所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过"套接字"向网络发出请求或者应答网络请求.  Socket和S ...

  6. 一个 Java 的 Socket 服务器和客户端通信的例子

    一个 HelloWord 级别的 Java Socket 通信的例子.通讯过程: 先启动 Server 端,进入一个死循环以便一直监听某端口是否有连接请求.然后运行 Client 端,客户端发出连接请 ...

  7. c#Socket服务器与客户端的开发(2)

    上一篇文章我们使用原生的socket分别实现了服务器和客户端, 本篇文章使用SuperSocket来开发实现服务器, 之前也介绍了SuperSocket是一个轻量级, 跨平台而且可扩展的 .Net/M ...

  8. 最简单的socket服务器与客户端

    服务器: //服务器 #include <stdio.h> #include <netinet/in.h> #include <unistd.h> #include ...

  9. 【Netty】Netty简介及服务器客户端简单开发流程

    什么是Netty Netty是一个基于Java NIO的编写客服端服务器的框架,是一个异步事件框架. 官网https://netty.io/ 为什么选择Netty 由于JAVA NIO编写服务器的过程 ...

  10. Socket 服务器和客户端通信

    //服务器端package com.svse.service; import java.io.BufferedReader; import java.io.IOException; import ja ...

随机推荐

  1. Ant Design Vue表单验证失败

    表单验证遇见的坑 01 如果你受控数据是这样写的话 const formState= reactive({ youForm:{ youNaNe:'', useSlectValue: '001', da ...

  2. Python获取内存、CPU利用率,CPU温度

    最近一个项目的需求,在软件上加入硬件实时信息,大概搜索一下,没太好的结果,所以决定自己写一篇 我的代码不难发现,都使用了psutil包,为什么呢,别的包我没太关注,纯粹是这台机的环境上有这个包 如果大 ...

  3. linux服务器cup100%问题排查

    一.出现问题在发现公司门禁服务无法开门的第一时间,去线上服务器上查看了一下进程的运行情况,具体运行如下: 第一次在查看的时候发现并没有我需要的服务entranceguard进程(图片是后续截图的) 二 ...

  4. 微信小程序网页嵌入开发

    无脑开发 下载微信开发者工具 新建一个项目找到index开头的进去全选删除粘贴下面代码 <!-- html --> <!-- 指向嵌入外部链接的地址 --> <web-v ...

  5. CF145E Lucky Queries 题解

    题目链接:CF 或者 洛谷 前置知识点:序列操作 本文关键词 约定俗称:因为频繁敲最长不下降子序列 \(LNCS\) 和最长不上升子序列 \(LNIS\) 太麻烦了,下文将 \(000011111\) ...

  6. Linux 中通过虚拟地址获取物理地址并锁定

    在 Linux 开发过程中,申请内存后,某些时候需要用物理地址传给其他外设进行写入或者读取操作,同时考虑到防止被操作系统 sawp,导致实际的物理地址发生变化,从而在操作对应的虚拟地址时无法正常运行等 ...

  7. delphi 官方例子 simples 路径

    公用 文件件 可能是隐藏的 若是的话 则显示 隐藏

  8. MySQL查询语句的执行顺序

    一.编写查询SQL顺序 1.select 2.from 3.join on 4.where 5.group by 6.having 7.order by 8.limit 二.MySQL执行顺序 1.f ...

  9. .NET 团队公布.NET 9开发目标 并发布.NET9的首个预览版

    在一篇博文中我们对 .NET 9 的愿景[1]: .NET团队概述了.NET 9的开发目标和最终愿景,涵盖两大重点领域:云原生和智能应用程序开发.它在继.NET 8之后,继续强化对云原生应用和性能的支 ...

  10. NC200179 Colorful Tree

    题目链接 题目 题目描述 A tree structure with some colors associated with its vertices and a sequence of comman ...