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

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. MySQL控制权限

    编写顺序和执行顺序是不一样的 编写顺序: SELECT 字段列表 FROM 表名列表 WHERE 条件列表 GROUP BY 分组字段列表 HAVING 分组后条件列表 ORDER BY 排序字段列表 ...

  2. ts函数讲解与不确定参数是否使用以及限制返回类型

    1.声明式函数 函数有两个参数 参数的数据类型是 string number 返回值值 number 哈 function person(name: string, age: number): num ...

  3. 【解决了一个小问题】在某个linux基础镜像中安装python特定的版本

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 在某个基础镜像中,安装了python3.6.但是一个测试需 ...

  4. 【K哥爬虫普法】孤注一掷的爬虫er,究竟还要误入歧途多远?

    我国目前并未出台专门针对网络爬虫技术的法律规范,但在司法实践中,相关判决已屡见不鲜,K 哥特设了"K哥爬虫普法"专栏,本栏目通过对真实案例的分析,旨在提高广大爬虫工程师的法律意识, ...

  5. PostgreSQL中的B-TREE索引

    分析了解pgsql中的索引 前言 索引 B-tree B-Tree和B+Tree的区别: pgsql中B-Tree 实现 如果该节点不是最右节点 如果该节点是最右节点 参考 分析了解pgsql中的索引 ...

  6. 19.0 Boost 基于ASIO网络编程技术

    Boost ASIO库是一个基于C++语言的开源网络编程库,该库提供了成熟.高效.跨平台的网络API接口,并同时支持同步与异步两种模式,ASIO库提供了多重I/O对象.异步定时器.可执行队列.信号操作 ...

  7. 【C语言深度解剖】一篇搞懂结构体内存对齐【结构体的大小你会算了吗】

    结构体内存对齐 大家好,我是西城s 文章目录 前言 引入 结构体内存对齐 `offsetof`宏的使用 为什么存在结构体内存对齐 修改默认对齐数 尾声 前言 作者: #西城s 这是我的主页:#西城s ...

  8. java在服务器上创建文件(以shell脚本为例)并执行

    java在服务器上创建文件(以shell脚本为例)并执行 1️⃣ 首先写个方法,来在服务器上创建脚本 package com.preciouslove.xinxin_emo.controller; i ...

  9. 【MFC学习一】BROWSEINFO选择路径导出文件

    mfc中使用 BROWSEINFO,使用 bi.lpfn = BrowseCallbackProc; 回调指定默认当前程序所在目录,导出csv文件,注意处理文件内容中的逗号.单引号.数字字符串开头有0 ...

  10. Linux-expect(以交互形式输入命令,实现交互通信)

    1.expect简介 expect是一种脚本语言,它能够代替人工实现与终端的交互,主要应用于执行命令和程序时,系统以交互形式要求输入指定字符串,实现交互通信. 安装命令: yum install ex ...